2010-07-08 52 views
2

我必須設置爲以下用戶和組表。SQL查詢來獲取所有用戶不在組

users 
    id int 

groups 
    id int 

users_groups 
    user_id int 
    group_id int 

示例數據:

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

有沒有辦法選擇誰同組中不是所有的用戶?我試圖加入usersusers_groups表和添加,比方說,group_id != 1條件,但我最終得到的用戶當它們處於另一個基團,例如,用戶 - [1,3,3,4,5]。

所以當我說我想誰在給定組,group_id != 1在這種情況下沒有用戶,例如結果應網友[3,5]。

回答

3

選擇用戶給定組是使用NOT IN的ID最簡單的方法:

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

其他常用的替代方案是NOT EXISTS

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

而且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

試試這個:

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

我想在這種情況下使用「WHERE不存在」聲明。

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 

的關鍵詞是GROUP BY

0

試試這個:

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

您可以使用查詢,如:

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