Как объединить несколько таблиц и связать идентификатор с именем столбца из другой таблицы - PullRequest
0 голосов
/ 28 февраля 2020

У меня есть эти таблицы со следующими именами столбцов:

игроков:

id имя_ фамилии фамилия возраст позиция зарплата hire_date skill_data_id team_id

Навыки:

id, dribbling, pace, passing, shooting, speed, strength

города:

id, name, country_id

команды:

 id name    established fan_base    stadium_id

Вкл. На этой базе я нашел игроков с максимальной скоростью в отношении городов, в которых играла их команда.

В то же время я должен пропускать игроков, которые играли в команде «Devify».

В данный момент я пытался использовать этот код, но окончательный результат неверен.

select max(s.speed) as `max_speed`,tt.name as `town_name`
from skills_data as s
right join players as p on s.id = p.skills_data_id
inner join teams as t on p.team_id = t.id
inner join towns as tt on  p.team_id = tt.id
where t.name not like 'Devify'
group by s.id
order by max(s.speed) desc, town_name;

Результат должен быть примерно таким:

max_speed   town_name
97          Smolensk
92          Bromma
92          Lühua
...
NULL       Zavolzh’ye

Мой результат:

max_speed   town_name
97          Montréal-Ouest
92          Dalubian
92          Samsan

Заранее спасибо.

1 Ответ

0 голосов
/ 28 февраля 2020

В вашем предложении group by есть проблема: вы должны группировать по городам, а не по идентификатору навыка.

Я также довольно подозрительно отношусь к условию соединения, которое приводит к towns (см. мой комментарий под вашим вопросом): но если вы получаете результаты для существующего запроса, он должен быть правильным ...

Другие изменения в вашем запросе:

  • изменено ваш right join для inner join

  • использовал более значимые псевдонимы таблиц

  • использовал условие неравенства вместо not like, чтобы исключить нежелательная команда

Новый запрос:

select 
    max(sk.speed) as max_speed,
    to.name as `town_name`
from skills_data as sk
inner join players as pl on sk.id = pl.skills_data_id
inner join teams   as te on pl.team_id = te.id and te.name <> 'Devify'
inner join towns   as to on pl.team_id = to.id 
group by to.id, to.name
order by max_speed desc, town_name;
...