2010-07-08 6 views
2

J'ai les tables d'utilisateurs et de groupes configurées comme suit.Requête SQL pour que tous les utilisateurs ne soient pas dans le groupe

users 
    id int 

groups 
    id int 

users_groups 
    user_id int 
    group_id int 

données Exemple:

+---------+----------+ 
| user_id | group_id | 
+---------+----------+ 
| 1  | 1  | 
| 1  | 2  | 
| 2  | 1  | 
| 3  | 2  | 
| 3  | 3  | 
| 4  | 1  | 
| 4  | 2  | 
| 5  | 2  | 
+---------+----------+ 

est-il un moyen de sélectionner tous les utilisateurs qui ne sont pas dans un groupe donné? J'ai essayé de joindre les tables users et users_groups et d'ajouter, disons, une condition group_id != 1, mais je finis par obtenir l'utilisateur quand ils sont dans un autre groupe, par exemple les utilisateurs [1, 3, 3, 4, 5]. Donc quand je dis que je veux des utilisateurs qui ne font pas partie d'un groupe donné, group_id != 1 dans ce cas, les résultats d'exemple devraient être des utilisateurs [3, 5].

Répondre

3

La façon la plus simple de choisir l'identifiant des utilisateurs pas un groupe donné est d'utiliser NOT IN:

SELECT id 
FROM users 
WHERE id NOT IN (SELECT user_id FROM users_groups WHERE group_id = 1) 

D'autres alternatives couramment utilisées sont NOT EXISTS:

SELECT id 
FROM users 
WHERE NOT EXISTS (
    SELECT NULL 
    FROM users_groups 
    WHERE group_id = 1 
    AND user_id = users.id 
) 

Et LEFT JOIN/IS NULL:

SELECT id 
FROM users 
LEFT JOIN users_groups 
ON users.id = users_groups.user_id 
AND users_groups.group_id = 1 
WHERE users_groups.user_id IS NULL 
2

Essayez ceci:

SELECT * FROM users WHERE id 
    NOT IN (SELECT user_id FROM users_groups WHERE group_id = 1) 
-1

j'utiliser un « OU PAS EXISTER » déclaration dans ce cas.

0
SELECT a.* FROM users AS a 
LEFT JOIN users_groups AS b ON b.user_id=a.id 
WHERE b.group_id!=1 
GROUP BY a.id 

Le mot-clé est GROUP BY

0

Essayez ceci:

SELECT * 
FROM users u 
LEFT OUTER JOIN users_groups ug ON ug.user_id = u.user_id 
    AND ug.group_id =1 
WHERE ug.user_id IS NULL 
1

Vous pouvez utiliser une requête comme:

Select Users.* 
from Users 
where id in 
    (Select user_id from users_groups where group_id <> given_group_id) 
Questions connexes