J'envisage les 2 tables suivantes
select ur.user_id, ur.role_id from user_roles ur where ur.user_id in (non_special_user_ids.user_id)
3 Réponses :
Vous pouvez utiliser les fonctions de fenêtre - si vous exécutez MySQL 8.0:
select ur.*
from user_roles ur
where not exists (
select 1
from user_roles ur1
inner join roles r1 on r1.role_id = ur1.role_id
where ur1.user_id = ur.user_id and r1.code_name = 'special_role'
)
Nous utilisons mysql 5.7 :(
Dans votre clause "Se jointure intérieure", je pense que vous voulez dire sur r.role_id = ur1.role_id code>, oui?
@Jed: En effet. J'ai corrigé ma réponse.
juste rejoindre. Cela devrait être assez rapide en supposant que vous avez des clés configurées.
SELECT * FROM user_roles WHERE user_id NOT IN(
SELECT user_id FROM user_roles JOIN role ON user_role.role_id = role.role_id
WHERE role.role_code = 'special_role')
AND user_id IN (1, 2, 3 ...)
Avec les mêmes données, votre suggestion me donnerait 3 résultats [1,2], [2,2], [3,2]. Je veux recevoir seulement [2,2], [3,2]. Puisque l'utilisateur 1 a le "rôle particulier", je ne veux pas inclure aucun des utilisateurs user_roles.
Édité avec une solution
Utilisez voir le Démo . P> P> dans code> et pas dans code> pour les 2 conditions: