2011-08-10 82 views
1

我正在創建一個清單式程序,其中文件被分配給清單,並且檢查某些文件清單中的項目。我試圖運行一個查詢,返回所有準備好某個清單項目的文件(項目被排序)。SQL左側加入問題

因此,例如,我想看看哪些文件在準備清單項目編號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