4

用户表

ID | name 
1  | ada    
2  | bob   
3  | tom  

组表

ID | name
1  | group A
2  | group B
3  | group C

用户组表

user_id | group_id
1       | 1
2       | 1
1       | 2
2       | 2
3       | 2
1       | 3
3       | 3

给定的用户 ID 组:[1, 2, 3]

如何查询上述列表中所有用户所属的组?(在这种情况下:B组)

4

4 回答 4

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

要获取包含所有指定用户的组:

    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

SQL 小提琴:http ://sqlfiddle.com/#!6/0e968/3

于 2013-07-22T05:12:43.963 回答
1

尝试这个:

Select t2.name         
     FROM        
    (Select group_id 
       From 
        user_group 
      Group by group_id 
     Having Count(user_id) = (Select Count(*) FROM User_Table)) AS T1        
     INNER JOIN        
       Group_Table AS T2
         ON T1.group_id = T2.ID 

见小提琴:http ://sqlfiddle.com/#!2/fa7250/4

于 2013-07-22T06:11:55.310 回答
0
SELECT name FROM group_tbl WHERE id IN (SELECT g_id FROM user_grp GROUP BY g_id HAVING Count(u_id)=(SELECT Count(id) FROM user_tbl));
于 2013-07-22T05:48:27.340 回答
0
Select UserID,count(*)
From UserGroupTable
group by UserID

这将给出 3 的计数,其中 UserID/GroupID 是唯一的(正如 zerkms 指出的那样)

于 2013-07-22T05:09:24.463 回答