由于标题建议我有两个列表A和B,为了问题,我们假设列表A是1,2,3
而列表B是4,5,6
。我的表格布局非常简单,只包含两列tag_id
和file_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解决方案,我还没有想到。任何有关如何进行的建议将不胜感激,谢谢!
答案 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列表中
只需将列表值更改为您需要的任何内容