2010-01-15 3 views
0

Comment est-ce que j'interrogerais la base de données MySQL pour renvoyer des rôles qui ne sont pas encore assignés (comme disponible pour lui).Obtenir les rôles qui ne sont toujours pas affectés à la requête de membre

Avec user_roles de table:

|user_id|role_id| 
| 1 | 1 | 
| 1 | 2 | 
| 1 | 4 | 
| 1 | 7 | 

Comment puis-je interroger table rôles pour retourner le nom du rôle et de l'ID de tous les rôles qui ne sont pas affectés. role_id: 3,5,8, ...

Répondre

2

Essayez

SELECT * 
FROM roles r 
WHERE NOT EXISTS (
    SELECT 1 
    FROM user_roles ur 
    WHERE ur.role_id = r.id 
    AND ur.user_id = 1 
) 
+0

Merci! Très apprécié – LukeP

0
SELECT * 
FROM roles 
WHERE roles.id NOT IN (SELECT distinct role_id FROM user_roles) 

si vous voulez des rôles ne sont pas attribués à l'utilisateur 1.

SELECT * 
FROM roles 
WHERE roles.id NOT IN (SELECT distinct role_id FROM user_roles WHERE NOT user_ID = 1) 

Note: Ceci est beaucoup plus rapide que la réponse acceptée, car elle n'exécute la sous-requête qu'une seule fois et pas une fois pour chaque rangée de rôles.

+0

Cela ne renvoie que les rôles qui ne sont attribués à personne – LukeP

+0

C'est ce que vous avez demandé. "Comment puis-je interroger la table des rôles pour retourner le nom du rôle et l'identifiant de tous les rôles qui ne sont pas assignés." – Hogan

+0

Voir ci-dessus pour non affecté à l'utilisateur 1 - également ma note. – Hogan

1

Je préfère effectuer ce type de requête set-complément en utilisant une jointure externe, au lieu de sous-requêtes corrélées ou non corrélées.

SELECT r.id 
FROM roles r 
LEFT OUTER JOIN user_roles u 
    ON r.id = u.role_id AND u.user_id = 1 
WHERE u.role_id IS NULL; 
Questions connexes