0
votes

Pas en clause: comment obtenir tous les utilisateurs qui n'ont pas tous les éléments à l'intérieur non entre parenthèses

J'ai un problème à obtenir les utilisateurs qui n'ont pas tout l'ID de rôles à l'intérieur des parenthèses. La requête ci-dessous renvoie l'utilisateur s'il ne dispose pas d'un de ces rôles.

requête SQL: xxx

exemple de l'user_group_role: xxx

Dans cet exemple, l'utilisateur 3256 a tous les roles_id, l'utilisateur 62 n'a que les 4930 et 105 rôle_id, l'utilisateur 4 n'a aucun de ces éléments_id, dans mon cas, je veux que ma requête retourne l'utilisateur 4 Par exemple.

Merci pour votre aide!


1 commentaires

Par "pas tous" à vous dire que l'utilisateur n'a aucun de ces rôles ou l'utilisateur n'a d'autres mais pas tous ces rôles?


3 Réponses :


0
votes

Vous devez regrouper par chaque utilisateur et prendre uniquement ceux qui n'ont aucun de ces rôles. XXX

Le La clause est comme Mais pour des groupes de données et pas seulement un seul enregistrement.


0 commentaires

1
votes

Si vous avez une liste séparée d'utilisateurs, je vous recommanderais:

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) 
                );


0 commentaires

0
votes

Si vous avez une contrainte unique sur l'utilisateur et le rôle (ce qui signifie qu'un utilisateur ne peut pas être attribué le même rôle deux fois, même dans plusieurs groupes), vous pourriez faire:

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 commentaires