使用 SQL Groupby 在多对多 table 中选择记录并具有
selecting records in a many to many table using SQL Groupby and having
对于用户和角色之间的多对多关系,我有以下 UserRole table
UserRoleId | UserId | RoleId
------------------------
1 | 1 | A
2 | 1 | B
3 | 1 | C
4 | 2 | A
5 | 3 | B
6 | 3 | C
7 | 4 | C
我希望能够 select 符合以下条件的用户:
1)只有一个角色
2)那个角色是A
所以在上面的 table 中,只有 UserRoleId
4 应该返回,因为它满足两个条件。使用 groupby 并让我能够找到只有一个角色的 userId,但无法包含对第二个条件的检查。
select userId, count(userId)
from UserRole
group by userId
having COUNT(userId) = 1
如何使用 groupby
和 having
完成此操作?
一种方法
SELECT userId
FROM UserRole
GROUP BY userId
HAVING COUNT(*) = SUM(CASE WHEN RoleId = 'A' THEN 1 ELSE 0 END)
| USERID |
|--------|
| 2 |
这是一个SQLFiddle演示
这是另一种方式:
SELECT
UserId
FROM UserRole
GROUP BY UserId
HAVING
SUM(CASE WHEN RoleId = 'A' THEN 1 ELSE 0 END) = 1
AND SUM(CASE WHEN RoleId <> 'A' THEN 1 ELSE 0 END) = 0
对于用户和角色之间的多对多关系,我有以下 UserRole table
UserRoleId | UserId | RoleId
------------------------
1 | 1 | A
2 | 1 | B
3 | 1 | C
4 | 2 | A
5 | 3 | B
6 | 3 | C
7 | 4 | C
我希望能够 select 符合以下条件的用户: 1)只有一个角色 2)那个角色是A
所以在上面的 table 中,只有 UserRoleId
4 应该返回,因为它满足两个条件。使用 groupby 并让我能够找到只有一个角色的 userId,但无法包含对第二个条件的检查。
select userId, count(userId)
from UserRole
group by userId
having COUNT(userId) = 1
如何使用 groupby
和 having
完成此操作?
一种方法
SELECT userId
FROM UserRole
GROUP BY userId
HAVING COUNT(*) = SUM(CASE WHEN RoleId = 'A' THEN 1 ELSE 0 END)
| USERID | |--------| | 2 |
这是一个SQLFiddle演示
这是另一种方式:
SELECT
UserId
FROM UserRole
GROUP BY UserId
HAVING
SUM(CASE WHEN RoleId = 'A' THEN 1 ELSE 0 END) = 1
AND SUM(CASE WHEN RoleId <> 'A' THEN 1 ELSE 0 END) = 0