(SQL)匹配用户属于给定user_id []的哪个组

Dav*_* Ng 4 sql

用户表

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组)

Ste*_*ler 6

获取包含指定用户的所有组(即所有指定用户,而不是其他用户)

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