簡體   English   中英

MySQL對同一查詢進行雙重過濾

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM