SQL получает пользователей по одной группе, но исключает других - PullRequest
1 голос
/ 26 марта 2019

Я пытаюсь написать запрос, который извлекает всех пользователей, принадлежащих к группе A, но исключает пользователей, принадлежащих к группам B, C & D.

Пользователи уникальныидентифицируется 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?

Ответы [ 3 ]

2 голосов
/ 26 марта 2019

Использование агрегации:

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. Конечно, если вам нужны дополнительные столбцы из users, вы можете присоединиться к нему (или использовать in или exists).

1 голос
/ 26 марта 2019

использование существует

    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') )
0 голосов
/ 26 марта 2019

Вы можете использовать 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')
  )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...