首页 > 解决方案 > 如何加入几个表并将id与另一个表中的名称列连接

问题描述

我有这些具有以下列名称的表:

玩家:

id first_name last_name 年龄 职位 薪水 雇用日期 技能_数据_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

先感谢您。

标签: sqljoingroup-by

解决方案


您的条款中有一个问题group by:您应该按城镇而不是按技能 ID 分组。

我也对引入的连接条件非常怀疑towns(请参阅我在您的问题下的评论):但是如果您正在为现有查询获得结果,那么它一定是正确的......

您的查询的其他更改:

  • 把你改成right joininner 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;

推荐阅读