#mysql #join
#mysql #Присоединиться
Вопрос:
У меня есть 3 таблицы в базе данных mysql: PLAYERS
, SPORTS
и INTERESTS
PLAYERS
таблица содержит идентификатор и имя игрока (id,player_name)
Пример данных:
(1,David)
(2,Jack)
(3,Ron)
(4,Smith)
SPORTS
таблица содержит идентификатор и название вида спорта (id,sports_name)
Пример данных:
(1,Soccer)
(2,Tennis)
(3,Swimming)
Каждый игрок может быть заинтересован в нескольких видах спорта, поэтому INTERESTS
таблица имеет идентификатор игрока и спортивный идентификатор. (player_id,sports_id)
Пример данных:
(1,2)
(1,3)
(2,3)
Я хочу отображать имена игроков, которые играют в футбол, а также в теннис.
Не в футбол или теннис, а в Soccer и Tennis.
Ответ №1:
Select P.id, P.player_name
From Players As P
Join Interests As I
On I.player_id = P.id
Join Sports As S
On S.id = I.sports_id
Where S.sports_name In('Tennis','Soccer')
Group By P.id, P.player_name
Having Count( Distinct S.sports_name ) = 2
Комментарии:
1. Я думаю, вы, вероятно, захотите сгруппировать по чему-то другому, кроме имени игрока, верно? The player.id столбец уникален, но я бы не стал предполагать, что имя_игрока является. Я думаю, что это выдало бы нам ошибку, если игроку (1, ‘Bob Smith’) нравится футбол, а игроку (2, ‘Bob Smith’) нравится теннис.
2. Вы также должны убедиться, что существует ограничение на уникальность (player_id, sports_id) в таблице интересов (или иным образом убедиться, что все строки остаются уникальными). Потому что в противном случае один игрок мог бы указать свой интерес к футболу дважды и был бы выбран запросом.
3. @drewbob — Как пользователь узнает, просматривал ли он дубликат или нет? Т.е. как пользователь узнает, действительно ли (1, Боб Смит) совпадает с (2, Боб Смит). Тем не менее, это легко исправить.
4. @Roy — На самом деле, Count ( Отличное S.sports_name ) заботится об одном и том же игроке, имеющем один и тот же интерес дважды.
5. @Roy — Я не говорю о дубликатах. Я говорю о разных игроках с одинаковыми именами. Мы бы не хотели случайно включать Боба Смита, если ему нравится только теннис, а его другу с таким же именем нравится только футбол.
Ответ №2:
Непроверено, но я думаю, что что-то вроде этого может сработать:
SELECT
player_name
FROM
players
WHERE
EXISTS (SELECT id FROM interests i WHERE i.player_id = players.id AND i.sports_id = 1)
AND EXISTS (SELECT id FROM interests i WHERE i.player_id = players.id AND i.sports_id = 2)