我有一个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个查询来解决这个问题,但如果可能的话我想避免使用它。
有什么想法吗?
答案 0 :(得分: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
表中的gallery-9行(如果存在),或者加入NULL(如果存在)不(因为它是一个外连接)。
然后,通过检查gallery_files列中的NULL(我检查了G_ID,但任何列都有效),我们只从files
中获取那些不在库9中的行
答案 1 :(得分: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)