Выберите пользователей, имеющих только необходимые роли - PullRequest
3 голосов
/ 18 марта 2019

У меня есть стандартная таблица с отношениями пользователей-> ролей

user_id | role_id
----------------
1       |   1
1       |   2
1       |   3
2       |   1
2       |   3
3       |   1
3       |   2
4       |   1
4       |   2
4       |   3
4       |   4

Для ясного понимания

1: [1, 2, 3]
2: [1, 3]
3: [1, 2]
4: [1, 2, 3, 4]

Я хочу написать запрос, возвращающий пользователей, имеющих только необходимые роли.Например, если требуемые роли - [1, 2, 3, 5], тогда только пользователи 1, 2, 3 удовлетворяют условию, поскольку пользователь 4 имеет роль 4, которая не требуется

Ответы [ 2 ]

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

Вы можете использовать коррелированный подзапрос

 select * from tablename a
 where not exists (select 1 from tablename b where a.user_id=b.user_id and role_id not in (1,2,3,5))
1 голос
/ 18 марта 2019

Я бы использовал GROUP BY и HAVING:

select user_id
from user_roles ur
group by user_id
having sum( role_id not in (1, 2, 3, 5) ) = 0;

Я предпочитаю это вместо NOT EXISTS, потому что он возвращает user_id s без дубликатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...