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

时间:2013-07-22 04:45:58

标签: sql

用户表

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

组表

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

user_group表

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

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

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

4 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分:0)

Select UserID,count(*)
From UserGroupTable
group by UserID

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

答案 3 :(得分: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));