mySQL对同一个查询进行双重过滤

时间:2012-03-08 16:10:31

标签: php mysql

我有一个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个查询来解决这个问题,但如果可能的话我想避免使用它。

有什么想法吗?

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)