Как выбрать результаты SQL на основе нескольких таблиц

20

Мне нужно выбрать результаты из одной таблицы на основе определенных значений соответствия в нескольких других таблицах. У меня есть следующие таблицы:

person: id, firstname, lastname
team: id, teamname
player: id, person_id(FK), team_id(FK)
coach: id, person_id(FK), team_id(FK)

Мне нужно вернуть всех тренеров и имен игроков для каждой команды. Я только когда-либо использовал внутренние соединения, и мне кажется, что я не могу использовать их здесь, поэтому любая идея, как это сделать?     

задан cfrederich 05.07.2011 в 20:59
источник
  • спасибо за редактирование. Я забыл поместить поля в тег кода здесь. –  cfrederich 05.07.2011 в 21:01
  • Я не уверен, почему у вас такая настройка базы данных. Почему бы просто не иметь одну таблицу для игроков и одну для тренеров с team_id как FK для обоих. Таким образом, вы можете просто запустить что-то вроде «выбрать« из тренера c, игрока p, где team_id =? ». Также я считаю, что хорошей практикой является использование того же имени для внешнего ключа как соответствующее поле (т. Е. Поле id в таблицу команд следует называть «team_id» так же, как FK). –  ryoung 05.07.2011 в 21:11

2 ответа

26

Это даст вам тренер:

SELECT team.Teamname, person.Firstname, person.Lastname
FROM person
JOIN coach ON person.id = coach.person_id
JOIN team  ON coach.team_id = team.id

И это даст вам игроков:

SELECT team.Teamname, person.Firstname, person.Lastname
FROM person
JOIN player ON person.id = player.person_id
JOIN team  ON player.team_id = team.id

Итак, не элегантный, простой ответ - просто бросить все это вместе с UNION .

    
ответ дан Chris Cunningham 05.07.2011 в 21:10
источник
  • работал как шарм. благодаря –  cfrederich 05.07.2011 в 21:19
  • +1 для простого ответа, но это можно сделать без UNION, также если вы используете UNION, вы должны сделать UNION ALL или включить p.id в select, если тренер и игрок имеют одинаковое имя –  Conrad Frix 05.07.2011 в 21:23
  • @cfrederich Конрад Фрикс имеет здесь хорошую точку зрения; мое решение использовало UNION специально, чтобы он не дублировал тренера, который также является игроком. Но мое решение в какой-то степени не справляется, если тренер и один из игроков - разные люди с тем же именем! UNION ALL вместо UNION, безусловно, является хорошим решением; Я собираюсь оставить свой ответ, как это с этим оговоркой. –  Chris Cunningham 05.07.2011 в 21:59
3

Просто используйте OR в соединении с командой

SELECT
     P.firstname,
     P.lastname,
     T.teamname
FROM
    person p id
    LEFT JOIN player pl
    ON p.id = pl.person_id
    LEFT JOIN coach c
    ON p.id = c.person_id
    LEFT JOIN team t
    ON pl.team_id = t.id
         or.c.team_id = t.id

Или если вы перешлите, если и ваша база данных имеет COALESCE

   LEFT JOIN team t
        ON COALESCE(pl.team_id,c.team_id)  = t.id
    
ответ дан Conrad Frix 05.07.2011 в 21:21
источник