2012-03-08 17 views
1

我有一個mySQL數據庫,其中包含3個表格以將圖庫與圖像相關聯。圖像存儲在表格「文件」和表格「畫廊」中的畫廊中,因此我使用名爲「gallery_files」的中間表格來表示它們之間的關聯。 「gallery_files」表分別由每個主表的2個ID(F_ID,G_ID)組成。mySQL對同一查詢進行雙重篩選

這些文件/圖像可以與多個圖庫相關聯,因此對於不同的G_ID,相同F_ID的「gallery_files」中可以有記錄。

現在,我想做一個mySQL查詢,它會帶來所有與給定圖庫無關的圖像。所以我用下面的查詢:

(假設爲ID畫廊:9)

SELECT * FROM files 
INNER JOIN gallery_files ON files.F_ID=gallery_files.F_ID 
WHERE files.F_FILETYPE IN ('.jpg','.jpeg','gif','png') 
    AND files.F_DELETED = 0 
    AND gallery_files.G_ID <> 9 

我的問題是,如果有一個不同的庫關聯的圖像的記錄它仍然帶來了它。我知道爲什麼會發生這種情況,但我想不出一個聰明的問題來完成這項工作。我知道如何通過使用2個查詢來解決這個問題,但我希望儘可能避免它。

有什麼想法?

回答

1

沒有一個子查詢,你可以使用一個外部聯接,併爲您的NULL列,只選擇不匹配在內的那些行加入:

SELECT * FROM files 
LEFT JOIN gallery_files ON files.F_ID=gallery_files.F_ID AND gallery_files.G_ID = 9 
WHERE files.F_FILETYPE IN ('.jpg','.jpeg','gif','png') 
    AND files.F_DELETED = 0 
    AND gallery_files.G_ID IS NULL 

通過將G_ID條件ON子句中的JOIN加入從gallery_files表中的每個文件到其畫廊 - 9行,如果存在,或者空值,如果它沒有(因爲它是一個外連接)。

然後,通過在gallery_files列(我查G_ID,但任何一列會工作)爲NULL檢查,我們只能從files這是得到那些行在畫廊9

+0

非常感謝你。那一個工作! :) – 2012-03-08 16:59:50

0

我相信NOT IN聲明應該做你想做的。

東西線沿線的:

SELECT * 
FROM files 
WHERE files.F_ID NOT IN 
    (SELECT files.F_ID 
    FROM files 
    INNER JOIN gallery_files ON files.F_ID=gallery_files.F_ID 
    WHERE files.F_FILETYPE IN ('.jpg','.jpeg','gif','png') 
    AND files.F_DELETED = 0 AND gallery_files.G_ID = 9)