MySQL:选择只有两行的具有特定值的所有行?

时间:2013-09-09 22:04:25

标签: mysql

我想抓住所有只有两个角色的用户,分别是1和4。

一个用户角色存储如下:

user_id role_id
54321   1
54321   4
54322   1
54323   1

如何进行查询,抓取user_id 54321,因为它只有两个角色,这两个是1和4?

我可以使用WHERE role_id IN(1,4),但这也会抓住具有其他角色的用户。

3 个答案:

答案 0 :(得分:3)

WHERE role_id IN (1, 4) GROUP BY user_ID HAVING COUNT(DISTINCT role_id) = 2

http://gregorulm.com/relational-division-in-sql-the-easy-way/

答案 1 :(得分:1)

这是set-within-sets查询的示例。我想用group byhaving解决这些问题,因为这是最常用的方法:

select user_id
from user_roles ur
group by user_id
having sum(role_id = 1) > 0 and
       sum(role_id = 4) > 0 and
       sum(role_id not in (1, 4)) = 0;

having子句有三个条件。第一个计算角色为1的次数,如果至少有一个此类角色,则user_id通过。第二个为4做同样的事情。最后检查没有其他值。

我喜欢这种结构,因为它很灵活。如果条件为1和4而其他条件允许,则只需删除第三个子句。如果条件是1或4而没有其他条件,则它看起来像:

having (sum(role_id = 1) > 0 or
        sum(role_id = 4) > 0
       ) and
       sum(role_id not in (1, 4)) = 0;

答案 2 :(得分:0)

SELECT u3.user_id
FROM t u1, t u2, t u3
WHERE u1.role_id = 1 AND u2.role_id = 4
 AND u3.user_id = u1.user_id 
 AND u2.user_id = u1.user_id
GROUP BY u3.user_id HAVING COUNT(u3.role_id) = 2;