2012-02-03 2 views
3

Таблица 1: ПользователиКаков правильный способ исключить эту группу из моего MySQL-запроса?

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

Таблица 2: Пользователь и роль в Команда Lookup

| 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

Я пишу это без подзапроса, что большинство людей используют:

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

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 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'); 
Смежные вопросы