2011-08-10 18 views
1

チェックリスト形式のプログラムを作成しています。ファイルはチェックリストに割り当てられており、チェックリストの項目をチェックして特定のファイルをチェックしています。私は特定のチェックリスト項目(項目が順序付けられている)のために準備ができているすべてのファイルを返すクエリを実行しようとしています。SQL Left Join問題

たとえば、チェックリスト項目番号3の準備が整っているファイルを確認しようとしているため、項目番号2はチェックされているが、項目番号3はチェックされていないファイルはすべて検索する必要があります。

サブクエリがこの問題を解決することがわかっているにもかかわらず、サブクエリは使用しないことをお勧めします。これは、このクエリがすべてのチェックリスト項目に対して実行されるためですここのクエリはパフォーマンスに悪影響を及ぼします。ここで

は、これまでのところ、私のクエリです:

SELECT 
    DISTINCT f.filename, f.id 
FROM 
    files f LEFT JOIN checklist_item_checklist cic1 LEFT JOIN checklist_check cc1 ON 
    cc1.checklist_item_checklist_id = cic1.checklist_item_checklist_id ON 
    cc1.file_id != f.id,checklist_item_checklist cic2, 
    checklist_check cc2 
WHERE 
    cic1.checklist_item_checklist_id = 2 AND 
    cic2.order_number = cic1.order_number - 1 AND 
    cic1.checklist_id = cic2.checklist_id AND 
    cc2.checklist_item_checklist_id = cic2.checklist_item_checklist_id AND 
    cc2.file_id = f.id 

テーブルの構造は次のとおりです。

ファイル

  • ID(PK)
  • ファイル名

checklist_item_checklist

  • checklist_item_checklist_id(PK)
  • ORDER_NUMBER

checklist_check

  • FILE_ID(FKがfiles.idする)
  • checklist_item_ checklist_id(FKからchecklist_item_checklist.checklist_item_checklist_id)

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

答えて

1

クエリには多くの構文エラーがあります。私はサブクエリが必要だと信じています。

これは動作するはずです:

SELECT f.id, f.filename 
FROM files f 
JOIN checklist_check cc ON cc.file_id = f.id 
JOIN checklist_item_checklist cic ON cic.checklist_item_checklist_id = cc.checklist_item_checklist_id AND cc.order_number = 2 
WHERE f.id not in(
    SELECT f.id, 
    FROM files f 
    JOIN checklist_check cc ON cc.file_id = f.id 
    JOIN checklist_item_checklist cic ON cic.checklist_item_checklist_id = cc.checklist_item_checklist_id AND cc.order_number = 3) 
+0

を私のクエリは実際に構文エラーがない、細かい動作します。あなたのクエリはいくつかの構文エラーを修正しました。私は途中でMySQLを使用しています。そして、はい、私はサブクエリ(構文がない)を使用して問題を解決しました、私はちょうど別のソリューションがあったと思っていた。しかし、ありがとう! – Massenburger