2012-02-22 6 views
2

この質問のタイトルは苦労しましたが、SQLの専門家にとっては簡単だと思います。mysql - すべてのサブ項目のステータスが条件を満たしている項目の数を取得する

テーブル:

SIMULATION: ID, SIMULATION_SET_ID, EXECUTION_STATUS 
SIMULATION_SET: SET_ID 
SIMULATION_BATCH: ID 
BATCH_ELEMENT: SIMULATION_BATCH_ID, SIMULATION_SET_ID 

(すなわち、セットは、シミュレーションの束を含むバッチは、中間テーブルを介してセットの束を含むバッチが実際に基づいてグループセットにメタ容器です。それらが要求され、コンテナとして使用されますが、それ自体にステータスが含まれていません)。

完成したバッチの数を返そうとしていますが、完成したバッチはすべてのシミュレーション実行ステータスがCOMPLETEDになっています。しかし、たとえすべてが完成していなくても、完成したシミュレーションがバッチリになっているようです。これは私の試みだった:

SELECT COUNT(DISTINCT B.ID) 
FROM SIMULATION_BATCH B 
INNER JOIN BATCH_ELEMENT BE ON BE.SIMULATION_BATCH_ID=B.ID 
INNER JOIN SIMULATION S ON S.SIMULATION_SET_ID=BE.SIMULATION_SET_ID 
WHERE S.EXECUTION_STATUS ='COMPLETED'"; 

だから私はこれがうまくいかないと思った。私はAND NOT EXISTS(SELECT ...)句を追加して、実行状態が完了していないシミュレーションを実行していたバッチを除外しようとしましたが、何も動作しませんでした。走っていた。これは私が追加したものです:

AND NOT EXISTS (SELECT SIM.ID 
FROM SIMULATION SIM 
INNER JOIN BATCH_ELEMENT BE2 ON BE2.SIMULATION_SET_ID=SIM.SIMULATION_SET_ID 
WHERE BE.SIMULATION_BATCH_ID=B.ID AND SIM.EXECUTION_STATUS != 'COMPLETED'); 

ありがとうございました。私はサブクエリをよりよく学ぶ必要があると思うが、私はよくわからない。私はカウントを得る方法を見つけた後、バッチのリストを取得する必要があります。しかし、カウントを得ることができれば、私はそれを行うことができます。

更新:私はこれを一日中続けてきましたが、もっと間違ったことを除いてそれほど進歩はしていません。私が探しているものを簡単に説明する方法は、バッチ内のすべてのシミュレーションがいくつかの基準(ステータスが完全であるなど)を満たすバッチを必要としていることです。 ANY(少なくとも1)のシミュレーションが基準を満たしているときに私はこれを行うことができますが、それは私を捨てているようだ。どんなアイデアでも大歓迎です。

あなた NOT EXISTSが働いていたが、ここでは少し異なるアプローチだしなかったであろう、なぜ私は表示されません
+1

サンプルデータを投稿できますか?正直なところ、あなたのクエリはうまくいくように見えます... –

+0

私はサンプルデータを得ることができますが表示されます。 not exists節で何が起こったのかは、シミュレーションが実行されていたときに0のカウントが得られたことと、すべてが完了したときにカウントが満了したことです。 – titania424

答えて

2

サブクエリで、何かが実行されているときに全体的なクエリが「一貫して空のセットを返した理由」を説明する誤植があると思います。「

あなたのサブクエリの次の行を参照してください。

WHERE BE.SIMULATION_BATCH_ID=B.ID AND SIM.EXECUTION_STATUS != 'COMPLETED'); 

私はあなたの代わりにこれを持っているためのものだと思う:

WHERE BE2.SIMULATION_BATCH_ID=B.ID AND SIM.EXECUTION_STATUS != 'COMPLETED'); 

それが問題を修正する場合は、あなたもしてクエリを簡素化してみてくださいこのような何か:

SELECT COUNT(DISTINCT B.ID) 
FROM SIMULATION_BATCH B 
INNER JOIN BATCH_ELEMENT BE ON BE.SIMULATION_BATCH_ID=B.ID 
AND NOT EXISTS (
    SELECT SIM.ID 
    FROM SIMULATION SIM 
    INNER JOIN BATCH_ELEMENT BE2 ON BE2.SIMULATION_SET_ID=SIM.SIMULATION_SET_ID 
    WHERE BE2.SIMULATION_BATCH_ID=B.ID AND 
    SIM.EXECUTION_STATUS != 'COMPLETED'); 

これはそれを前提としています

  1. バッチには常に少なくとも1つのバッチ要素があります。
  2. バッチ要素には常に少なくとも1つのシミュレーションがあります。

「バッチの作成時にbatch_elementレコードが挿入されます。」という記述があるため、最初のケースが当てはまるようです。しかし、私は第二のものについては分かりません。

幸運を祈る!

+0

ありがとう、私はこれを試してみよう、それは私を夢中にされているが、私は数日間病気だった。タイプミスが正しいのであれば、私は壁に頭を叩いてしまいます。正しい道を歩いているだけなので、1つの論理ミスがあります。 – titania424

+0

それはうまくいきました。だから私はそれがうまくいくかのようにここにみんなが言った理由だと思う、ちょっとした間違いだった。あなたのソリューションはよりクリーンです。感謝!! – titania424

0

SELECT COUNT(DISTINCT B.ID) 
FROM SIMULATION_BATCH B 
INNER JOIN BATCH_ELEMENT BE ON BE.SIMULATION_BATCH_ID=B.ID 
INNER JOIN SIMULATION S ON 
    S.SIMULATION_SET_ID=BE.SIMULATION_SET_ID AND 
    S.EXECUTION_STATUS ='COMPLETED' 
WHERE NOT EXISTS (
    SELECT 1 
    FROM SIMULATION SUBSIM 
    WHERE 
     SUBSIM.SIMULATION_SET_ID=BE.SIMULATION_SET_ID 
     AND SUBSIM.EXECUTION_STATUS != 'COMPLETED' 
) 

(CAPSは、私の目に少し難しいですが、私はあなたの慣習を維持したいです...)

+0

Ha、CAPSについて私はそれがWindowsやLinux/Unix上で動くようになって以来、私は古い学校だと思います。それはもっと安全です。私はこれらの変更を試し、何が起こるか見る。あなたのご意見ありがとうございます、私はあなたに何が起こるかをお知らせします – titania424

+0

これを試してみました。すべてのバッチが完了したことがわかったら、私は19のカウントを取得します。次に、新しいバッチを開始し、19のカウントを取得します(これまでのところ良い)。しかし、バッチ内の1つのシミュレーションが完了するとすぐに、23人の他の人がいなくても、20のカウントが得られます。私が試している方法はすべて間違っているかもしれません。それは動作していないので、明らかに! – titania424

+0

@ titania424まだ23回のシミュレーションを行っているバッチには、まだ完了していないすべてのシミュレーションのための 'batch_element'レコードがありますか?あるいは、 'batch_element'レコードは、シミュレーションが完了したときに追加されるだけですか? –

0
SELECT COUNT(*) 
FROM (SELECT B.ID 
FROM SIMULATION_BATCH B 
INNER JOIN BATCH_ELEMENT BE ON BE.SIMULATION_BATCH_ID=B.ID 
INNER JOIN SIMULATION S ON S.SIMULATION_SET_ID=BE.SIMULATION_SET_ID 
INNER JOIN SIMULATION SC ON SC.SIMULATION_SET_ID=BE.SIMULATION_SET_ID 
WHERE SC.EXECUTION_STATUS ='COMPLETED'" 
GROUP BY B.ID 
HAVING COUNT(S.ID) = COUNT(SC.ID)) AS COMPLETED_BATCHES; 

SIMULATIONを2回結合し、EXECUTION_STATUSで1つ(SC)をフィルタリングします。 HAVING節は、数値シミュレーションが完成したシミュレーションの数と等しい行だけを必要としていることを示しています。

EDIT:デバッグのために、このクエリはあなたにそれがどのように動作するかの感触を与える必要があります。

SELECT B.ID, COUNT(S.ID) AS SIMULATION_COUNT, COUNT(SC.ID) AS COMPLETED_SIM_COUNT 
FROM SIMULATION_BATCH B 
INNER JOIN BATCH_ELEMENT BE ON BE.SIMULATION_BATCH_ID=B.ID 
INNER JOIN SIMULATION S ON S.SIMULATION_SET_ID=BE.SIMULATION_SET_ID 
INNER JOIN SIMULATION SC ON SC.SIMULATION_SET_ID=BE.SIMULATION_SET_ID 
WHERE SC.EXECUTION_STATUS ='COMPLETED'" 
GROUP BY B.ID 

あなたも、サブクエリのためにそれを使用HAVINGをスキップして、行うことができます:

SELECT COUNT(ID) 
FROM (
    SELECT B.ID, COUNT(S.ID) AS SIMULATION_COUNT, COUNT(SC.ID) AS COMPLETED_SIM_COUNT 
    FROM SIMULATION_BATCH B 
    INNER JOIN BATCH_ELEMENT BE ON BE.SIMULATION_BATCH_ID=B.ID 
    INNER JOIN SIMULATION S ON S.SIMULATION_SET_ID=BE.SIMULATION_SET_ID 
    INNER JOIN SIMULATION SC ON SC.SIMULATION_SET_ID=BE.SIMULATION_SET_ID 
    WHERE SC.EXECUTION_STATUS ='COMPLETED'" 
    GROUP BY B.ID 
) AS COUNTED_BATCHES 
WHERE SIMULATION_COUNT = COMPLETED_SIM_COUNT; 
+0

ありがとう!私はこれを試してみる。私は "HAVING"の他のいくつかの例を見ましたが、私はこれを行う方法を知らないことを告白します。私は小規模なプロジェクトですべてを少しずつやり直さなければならなくて、データベースの人格にしかなりません。私はそれを試した後、ここで更新されます。 – titania424

+0

UPDATE、OK、正常に動作しませんでした。COMPLETEDステータスのシミュレーションが1つ存在するとすぐに、バッチ数が増えました。私はこれが近いと思うし、私は試し続けます。 – titania424

+0

私はこの例を持っているのを見ましたが、いくつかの左の結合も使用しています。問題は彼らが何をしているのか分かりません。 http://stackoverflow.com/questions/5352461/find-a-way-to-query-a-list-of-items-that-meet-all-of-a-criteria-using-sql – titania424

関連する問題