2012-02-03 78 views
3

表1:用戶什麼是從我的MySQL查詢中排除這個組的正確方法?

| profile_id | name | 
------------------------ 
| 1   | Joe  | 
| 2   | Jane | 
| 3   | Jill | 
| 4   | Jeffery | 

表2:用戶和角色到團隊查找

| team_id | profile_id | role | 
--------------------------------- 
| 1  | 1   | coach | 
| 1  | 2   | player | 
| 2  | 4   | coach | 
| 2  | 1   | player | 

的情況是,吉爾正在建設一個團隊和限制是你不能成爲一個球員上不止一個團隊。所以我正在試圖建立一個查詢,提拔那些有資格加入Jill團隊的人。

我第一次嘗試是:

SELECT `users`.`profile_id` 
FROM `users` LEFT JOIN `user_role_to_team_lookup` AS `utr` USING(`profile_id`) 
WHERE `utr`.`role` != 'player' OR `utr`.`role` IS NULL 

的問題是,因爲喬是一名教練,他的條件匹配〜雖然他也已經是一個球員。

從結果集中排除已經是玩家的用戶的正確方法是什麼?

回答

2

我會寫這種沒有子查詢,大多數人使用:

SELECT u.profile_id 
FROM users AS u 
LEFT OUTER JOIN user_role_to_team_lookup AS utr 
    ON u.profile_id = utr.profile_id AND utr.role = 'player' 
WHERE utr.profile_id IS NULL 

換句話說,尋找一個用戶誰已經是一名球員。那些不是玩家的人將不匹配外連接中的行,因此utr的任何列都將爲NULL。

但最好將條件放在連接的ON子句中。

+0

謝謝!這正是我所期待的。 – Shad 2012-02-03 19:19:43

1
SELECT u.profile_id 
    FROM users u 
    WHERE NOT EXISTS(SELECT 1 
         FROM user_role_to_team_lookup urtl 
         WHERE urtl.profile_id = u.profile_id 
          AND urtl.role = 'player') 
+0

+1謝謝你,研究你的答案我能夠學習_why_'EXISTS'方法比其他樣式'NOT IN'子查詢更有效率。 – Shad 2012-02-03 19:20:40

0

你或許可以這樣做:

SELECT profile_id FROM users 
WHERE profile_id NOT IN (SELECT DISTINCT profile_id FROM utr WHERE role = 'player'); 
0
SELECT profile_id 
FROM users 
WHERE profile_id NOT IN (
    SELECT profile_id 
    FROM user_role_to_team_lookup 
    WHERE role = 'player'); 
相關問題