NOT IN: как получить всех пользователей, у которых нет ВСЕХ элементов внутри скобок NOT IN - PullRequest
0 голосов
/ 30 января 2020

У меня проблема с получением пользователей, у которых нет ALL идентификатора ролей в скобках. Запрос ниже возвращает пользователя, если у него нет одной из этих ролей.

SQL Запрос:

select user_id,group_id,role_id from user_group_role where role_id not in (23,98,105,3310,4928,4929,4930) ;

Пример user_group_role:

 USER_ID       GROUP_ID      ROLE_ID       
---------- --------------- --------------- 
 3256          2                23
 3256          3                98
 3256          2                4928
 4             2                54
 3256          1                4929
 3256          1                4930
 10256         3                23 
 62            2                105  
 700           2                3310
 899           2                41
 3256          1                105
 3256          1                3310
 3256          1                4930
 62            2                4930

В этом примере пользователь 3256 имеет все role_id, пользователь 62 имеет только 4930 и 105 role_id, пользователь 4 не имеет ни одного из этих role_id, в моем случае я хочу, чтобы мой запрос возвратил пользователя 4, например.

Спасибо за вашу помощь!

Ответы [ 3 ]

1 голос
/ 30 января 2020

Если у вас есть отдельный список пользователей, я бы порекомендовал:

select u.*
from users u
where not exists (select 1
                  from user_group_role ugr
                  where ugr.user_id = u.user_id and
                        ugr.role_id in (23, 98, 105, 3310, 4928, 4929, 4930) 
                );

Я рекомендую это, потому что это будет включать пользователей, которых нет в таблице user_group_role, поэтому список кажется более полным. Конечно, вы можете захотеть только пользователей, у которых есть хотя бы одна строка в таблице, и в этом случае users не потребуется для этого запроса.

0 голосов
/ 30 января 2020

Если у вас есть уникальное ограничение для пользователя и роли (то есть пользователю не может быть назначена одна и та же роль дважды, даже в нескольких группах), вы можете сделать следующее:

SELECT user_id
FROM user_group_role ugr
GROUP BY user_id
HAVING SUM(
    CASE WHEN role_id IN (23,98,105,3310,4928,4929,4930) 
    THEN 1 ELSE 0 END) < 7
0 голосов
/ 30 января 2020

Вы должны группировать по каждому пользователю и брать только тех, кто не имеет ни одной из этих ролей.

select user_id
from user_group_role 
group by user_id
having sum(case when role_id in (23,98,105,3310,4928,4929,4930) then 1 end) = 0

Предложение having похоже на where, но для групп данных, а не только для одной записи .

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