2010-11-30 13 views
1

historyIDがNULL、worktype = "WEST"、少なくとも4か月前のcompleteDateの行と同じworkIDを持つすべてのエントリを 'archive'テーブルで検索しようとしています。私はこの要求を完了するためにサブクエリを使用しています。より効率的な方法がありますか?私の質問は以下の通りです。このmysqlサブクエリをJOINsで短縮できますか?

SELECT * from archive b WHERE b.workID IN 
(SELECT a.workID FROM archive a, worktypes t 
WHERE a.historyID IS NULL AND (t.worktype IN ('WEST') AND a.worktype = t.id) 
AND a.completeDate >= DATE(NOW() - Interval 4 month)); 

追加情報:テーブルはワークタイプによってのみ関連しています。基本的に私はworktypesテーブルを使用しているので、ID番号を与える代わりに 'WEST'と入力するだけで、クエリを一目でわかりやすくすることができます。私はクエリに追加しました。私はそれをすべてコピーアンドペーストしませんでした。おっとっと。

ありがとうございました!

+0

アーカイブとワークタイプの結合条件が不足しているようです。 2つのテーブルはどのように関連していますか? –

+0

サブクエリに 'a'と' t'の間に結合述語がありませんので、あなたはデカルト結合をしています。これはmysqlの 'の'で非常に悪いニュースです[それは繰り返し評価される!](http://stackoverflow.com/questions/3417074/why-would-an-in-condition-be-slower-than- in-sql) –

答えて

1
SELECT b.* 
    FROM archive b 
     INNER JOIN archive a 
      on b.workID = a.workID 
       AND a.historyID IS NULL 
       AND a.completeDate >= DATE(NOW() - Interval 4 month) 
     INNER JOIN worktypes t 
      ON a.worktype = t.id 
       AND t.worktype = 'WEST' 
0

あなたのクエリと提案されたソリューションの問題は、テーブルが互いにどのように関連しているかわかりません。あなたは仕事のタイプにもあるアーカイブの中には何カラムありますか?

また、可能であれば "IN"を避けるべきですが、効率が悪いです。

+0

これは完全に真実です。正確なソリューションが必要な場合は、より多くの情報を掲載してください。ありがとうAaron Scruggs。 – Hypnus

0

確信度: SELECT * fromアーカイブa LEFT JOINワークタイプt ON a.workID = t.workID a.historyIDがNULLで、t.worktypeがIN( 'WEST')かつa.completeDate> = DATE(NOW () - 間隔4か月));

LEFT JOINは、最初のテーブルのすべてのエントリを取得し、一致する2番目のテーブルの対応する列を追加します。

これが役に立ちます。

関連する問題