2012-02-03 2 views
3

표 1 : 사용자MySQL Query에서이 그룹을 제외시키는 적절한 방법은 무엇입니까?

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

시나리오는 질이 팀을 구축하고, 제한은 당신이 선수가 될 수 없다는 점이다 한 팀 이상. 그래서 질의 팀에 합류 할 자격이있는 사람들을 끌어들이는 쿼리를 작성하려고합니다.

내 첫 번째 시도했다 :

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

누가 이미 선수 야. 플레이어가 아닌 사용자는 외부 조인의 행과 일치하지 않으므로 utr의 모든 열은 NULL이됩니다.

하지만 조인의 ON 절에 조건을 넣는 것이 가장 좋습니다.

+0

감사합니다. 이게 정확히 내가 찾고 있었던거야. – Shad

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 고맙습니다. 답변을 찾았습니다. 다른 스타일 인 'NOT IN'하위 쿼리보다 'EXISTS'방법이 더 효율적이라는 사실을 알게되었습니다. – Shad

0

아마 당신은이 작업을 수행 할 수 있습니다, 즉

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 

사용자를 찾아 : 나는 대부분의 사람들이 사용하는 것이 부질없이 본을 작성합니다

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'); 
관련 문제