我正在尝试编写一个查询,以检索属于组A
的所有用户,但不包括属于组B
,C
和D
的用户。 / 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
组中的任何人包括在内,如果他们属于B
,C
和D
组中,则将他们排除在外?
答案 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
中的其他列,则可以加入该列(或使用in
或exists
)。
答案 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')
)