2012-02-03 4 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 | 

シナリオは、ジルがチームを構築して、および制限は、あなたが上のプレーヤーすることができないということであるということです1つ以上のチーム。だから私はジルのチームに参加する資格のある人を引き上げるクエリを作成しようとしています。

私の最初の試みだった:

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ありがとう、あなたの答えを研究する私は、「EXISTS」メソッドが他のスタイルの「NOT IN」サブクエリより効率的であることを知りました。 – 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'); 
関連する問題