2012-12-11 30 views
10

我有一个交叉引用表:MySQL的 - 选择ID匹配的所有标签

ID | tag 
1 | 4 
1 | 5 
1 | 6 
2 | 4 
2 | 5 
2 | 8 
3 | 2 

我需要选择匹配一组标签的所有的标识。例如,如果我获得了标签'4','5',我将获得ID '1','2'。如果我给了标签'4','2'我不会得到任何ID,因为没有与匹配的所有标签。

而且,如果让我来标记'4','9'那么我应该也不会得到任何导致的ID,因为'9'搜索将导致NULL值,因此没有编号相符所有标签。

过去两天我一直拉我的头发。希望有人能帮助我。

+0

标签' '4','8''应该给你'ID = 2'作为结果,他们不应该吗? –

+0

是的,你是对的。我的错误 - 让我看看我能否修复它。 – user1113531

+1

也看到这个问题,超过10种方式来解决这个(常见)问题:** [如何过滤SQL结果在一个具有许多通过关系](http://stackoverflow.com/questions/7364969/how -to-filter-sql-results-in-a-many-through-relation)** –

回答

17

查询的想法是,您需要将记录数与您在WHERE子句中提供的值数匹配。

SELECT ID 
FROM tableName 
WHERE tag IN (4, 8) 
GROUP BY ID 
HAVING COUNT(*) = 2 

如果标签没有被指定为每一个ID唯一约束,那么DISTINCT需要

SELECT ID 
FROM tableName 
WHERE tag IN (4, 8) 
GROUP BY ID 
HAVING COUNT(DISTINCT tag) = 2 
+0

感谢您的快速响应和维护我的理智。这很好!对标签有一个独特的约束,所以第一个建议是完美的。 – user1113531

+0

不客气':D' –

+0

我的英雄!我用20行查询撕碎了我的头发,我所缺少的就是那部分,赞美! – NaturalBornCamper