SQL在列表A中选择但不在列表B中选择

时间:2014-07-22 19:19:52

标签: mysql sql

由于标题建议我有两个列表A和B,为了问题,我们假设列表A是1,2,3而列表B是4,5,6。我的表格布局非常简单,只包含两列tag_idfile_id。当file_id在列表A中而不在列表B中时,我想提出一种合理的方法从此表中选择tag_id

以下是一组示例数据:

tag_id   file_id
1        10
1        20
3        20
2        30
4        30
6        30

因此,理想的结果将是10,20

通常,对于如下所示的查询,这似乎相当简单:

SELECT `file_id` FROM `file_tags` WHERE `tag_id` IN(%v) AND `tag_id` NOT IN(%v)

(注意:%v只是将数组扩展为SQL的列表)

但是,这不起作用,因为file_id不是唯一的。它将始终匹配第一个列表中的内容,而第二个列表实际上是无关紧要的。在后视中这是有道理的,因为它一次只能看一行,所以很容易接近。

未来的查询似乎没有让我更进一步,但是为了尝试解决前一次尝试的单行范围,我尝试了以下方法:

SELECT `file_id` FROM `file_tags` WHERE `tag_id` IN(%v) AND NOT EXISTS (SELECT `file_id` FROM `file_tags` WHERE `tag_id` IN(%v))

然而,这种方法似乎也不起作用,相反,无论输入与前一个例子相比,它都不会返回任何内容。

这感觉就像是一个应该用SQL解决的问题相当简单,但是,我不知道如何继续这一点。我可以在返回初始列表后解决这个问题程序端并处理数据,但我觉得可能还有一个更好的纯SQL解决方案,我还没有想到。任何有关如何进行的建议将不胜感激,谢谢!

1 个答案:

答案 0 :(得分:1)

也许是这样的?

SELECT DISTINCT `file_id` 
FROM `file_tags` 
WHERE `tag_id` IN(1,2,3) 
  AND `file_id` NOT IN(
      SELECT `file_id` 
      FROM `file_tags` 
      WHERE `tag_id` IN(4,5,6)
  )

基本上说tag_id在第一个列表中,而file_id不在第二个tag_id列表中

只需将列表值更改为您需要的任何内容

SEE DEMO