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'と入力するだけで、クエリを一目でわかりやすくすることができます。私はクエリに追加しました。私はそれをすべてコピーアンドペーストしませんでした。おっとっと。
ありがとうございました!
アーカイブとワークタイプの結合条件が不足しているようです。 2つのテーブルはどのように関連していますか? –
サブクエリに 'a'と' t'の間に結合述語がありませんので、あなたはデカルト結合をしています。これはmysqlの 'の'で非常に悪いニュースです[それは繰り返し評価される!](http://stackoverflow.com/questions/3417074/why-would-an-in-condition-be-slower-than- in-sql) –