MySQL:只抓住只有一行的用户?

时间:2012-01-21 10:27:21

标签: mysql sql

我拥有的是什么:

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 ..某事?

3 个答案:

答案 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;