sql запрос: отображаемые имена игроков, играющих в футбол, а также в теннис

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