我拥有的是什么:
SELECT users.*
FROM users INNER JOIN roles_users ON users.id = roles_users.user_id
WHERE roles_users.role_id IN (1)
GROUP BY users.id
HAVING COUNT(*) = 1
我想抓住所有只有一行的用户,使用role_id 1。
以上查询会抓取所有拥有role_id 1行的用户,因此它还会显示那些拥有更多行且role_id为2的人,例如role_id 3。
那我该怎么办WHERE roles_users.role_id IN(1)而不是2,3,4 ..某事?
答案 0 :(得分:1)
添加反联接以排除那些也具有其他角色的用户
SELECT users.*
FROM users
INNER JOIN roles_users ON users.id = roles_users.user_id
-- replace by IN (1, 4) if needed
WHERE roles_users.role_id IN (1)
AND NOT EXISTS (SELECT 1 FROM roles_users
WHERE roles_users.user_id = users.id
-- replace by NOT IN (1, 4) if needed
AND roles_users.role_id NOT IN (1))
GROUP BY users.id
HAVING COUNT(*) = 1
以上是特定于MySQL的,通常情况下,您不应选择不属于GROUP BY
子句的列。此外,它可能效果不佳,因为roles_users
连接两次到users
。我不知道MySQL是否可以优化它。
答案 1 :(得分:0)
试试这个(未经测试):
SELECT users.*, COUNT(*) AS roleX_count
FROM users
INNER JOIN roles_users ON users.id = roles_users.user_id
GROUP BY users.id, roles_users.role_id
HAVING roleX_count = 1 AND roles_users.role_id = 1
答案 2 :(得分:0)
这样的事情可以解决问题:
SELECT users.*
FROM users
INNER JOIN roles_users ON users.id = roles_users.user_id
WHERE roles_users.role_id = 1
and 1 = (select count(*)
from roles_users
where users.id = roles_users.user_id)
GROUP BY users.id;