2012-02-03 41 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'); 
相关问题