[英]mySQL double filtering on the same query
我有一個mySQL數據庫,其中包括3個將畫廊與圖像關聯的表。 圖像存儲在表“文件”中,而圖像庫則存儲在表“畫廊”中,因此我將中間表“ gallery_files”用於它們之間的關聯。 “ gallery_files”表分別由每個主表的2個ID(F_ID,G_ID)組成。
這些文件/圖像可以與多個圖庫相關聯,因此對於不同的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個查詢來解決此問題,但如果可能的話,我想避免它。
有什么想法嗎?
如果沒有子查詢,則可以使用外部聯接,並檢查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
表連接到其gallery-9行(如果存在),或者將其不連接到NULL(因為它是外部聯接)。
然后,通過在gallery_files列中檢查NULL(我檢查了G_ID,但是任何列都可以使用),我們僅從不在 Gallery 9中的files
獲得了這些行。
我相信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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.