用户表
ID | name
1 | ada
2 | bob
3 | tom
Run Code Online (Sandbox Code Playgroud)
组表
ID | name
1 | group A
2 | group B
3 | group C
Run Code Online (Sandbox Code Playgroud)
user_group表
user_id | group_id
1 | 1
2 | 1
1 | 2
2 | 2
3 | 2
1 | 3
3 | 3
Run Code Online (Sandbox Code Playgroud)
给定用户ID组:[1,2,3]
如何查询上面列表中所有用户所属的组?(在这种情况下:B组)
获取包含指定用户的所有组(即所有指定用户,而不是其他用户)
DECLARE @numUsers int = 3
SELECT ug.group_id
--The Max doesn't really do anything here because all
--groups with the same group id have the same name. The
--max is just used so we can select the group name eventhough
--we aren't aggregating across group names
, MAX(g.name) AS name
FROM user_group ug
--Filter to only groups with three users
JOIN (SELECT group_id FROM user_group GROUP BY group_id HAVING COUNT(*) = @numUsers) ug2
ON ug.group_id = ug2.group_id
JOIN [group] g
ON ug.group_id = g.ID
WHERE user_id IN (1, 2, 3)
GROUP BY ug.group_id
--The distinct is only necessary if user_group
--isn't keyed by group_id, user_id
HAVING COUNT(DISTINCT user_id) = @numUsers
Run Code Online (Sandbox Code Playgroud)
要获取包含所有指定用户的组:
DECLARE @numUsers int = 3
SELECT ug.group_id
--The Max doesn't really do anything here because all
--groups with the same group id have the same name. The
--max is just used so we can select the group name eventhough
--we aren't aggregating across group names
, MAX(g.name) AS name
FROM user_group ug
JOIN [group] g
ON ug.group_id = g.ID
WHERE user_id IN (1, 2, 3)
GROUP BY ug.group_id
--The distinct is only necessary if user_group
--isn't keyed by group_id, user_id
HAVING COUNT(DISTINCT user_id) = 3
Run Code Online (Sandbox Code Playgroud)
SQL小提琴:http://sqlfiddle.com/#!6/968/3
| 归档时间: |
|
| 查看次数: |
268 次 |
| 最近记录: |