SQL按组划分用户,但排除其他组

时间:2019-03-26 10:58:32

标签: mysql sql

我正在尝试编写一个查询,以检索属于组A的所有用户,但不包括属于组BCD的用户。 / p>

用户在user_id表中由users唯一标识,但在groups表中可以有多个条目。

我有以下查询,但它不起作用:

SELECT user_id
FROM users
LEFT JOIN groups USING (user_id)
WHERE groups.name = 'A'
AND groups.name NOT IN ('B', 'C', 'D')

这只是从组A中选择所有用户。

如何将A组中的任何人包括在内,如果他们属于BCD组中,则将他们排除在外?

3 个答案:

答案 0 :(得分:2)

使用聚合:

SELECT user_id
FROM groups
GROUP BY user_id
HAVING SUM(g.name = 'A') > 0 AND
       SUM(g.name IN ('B', 'C', 'D')) = 0;

注意:您不需要加入users。您的查询仅选择groups表中的用户ID。当然,如果您需要users中的其他列,则可以加入该列(或使用inexists)。

答案 1 :(得分:1)

使用存在

    select t1.user_id from users t1
    where exists( select 1 from groups t2 where t1.user_id=t2.user_id
                   and t2.name='A')
   and not exists( select 1 from groups t2 where t1.user_id=t2.user_id
                        and t2.name NOT IN ('B', 'C', 'D') )

答案 2 :(得分:0)

对于组名EXISTS,您可以使用A;对于组名NOT EXISTS,您可以使用B, C, D

select distinct user_id
from groups g
where 
  exists (
    select 1 from groups where user_id = g.user_id and name = 'A'
  )
  and not exists (
    select 1 from groups where user_id = g.user_id and name in ('B', 'C', 'D')
  )