SQL 加入 3 个表?
SQL Join with 3 tables?
我正在尝试为足球网站建立数据库。
这是它的示意图。
我现在正在尝试制作最佳射手页面,并且我已经使用以下代码成功查询了最佳射手,并按降序排列了相应的进球数:
SELECT jogador.nome_jogador, count(nome_jogador)
FROM golo, jogador
where jogador_id_jogador = id_jogador
group by jogador.nome_jogador
order by count desc;~
我现在想做的是,在每个最佳射手的团队(葡萄牙语中的 equipa)中添加第 3 列,但我不明白我该怎么做,因为每次我在 select查询它显示错误。
每个进球都是得分球员的id,每个球员都是球队的id,这样可以吗?
还有一个加入:
select j.nome as nome_jogador, e.nome as nome_equipa, count(*) cnt_golo
from golo g
inner join jogador j on j.id_jogador = g.jogador_id_jogador
inner join equipa e on e.id_equipa = j.equipa_id_equipa
group by j.id_jogador, e.id_equipa
order by cnt_golo desc;
备注:
始终使用显式连接而不是老式的隐式连接(在 from
子句中使用逗号);这是几十年来的最佳做法
使用table别名来缩短查询,并用它们所属的table限定查询中的所有列,因此查询是明确的
正如 Schwern 在评论中指出的那样,您的图表和查询并不完全匹配;这使用图表的列名称
group by
子句使用了未聚合列的table的主键;如果由于某种原因导致问题,您可能需要枚举所有起作用的列:group by j.id_jogador, e.id_equipa, j.nome, e.nome
首先,让我们将其切换为 standard join syntax。
select jogador.nome_jogador, count(id_golo)
from golo
join jogador on jogador_id_jogador = id_jogador
group by jogador.nome_jogador
order by count desc;~
请注意,您应该按 ID 分组,而不是按姓名分组,以防两个玩家重名。因为 ID 是唯一的,所以发现按 ID 分组,但 select 名称。
你计算的是目标,而不是名字。
select jogador.nome, count(id_golo)
from golo
join jogador on jogador_id_jogador = id_jogador
group by jogador.id_jogador
order by count desc;
现在我们可以添加第三个连接了。如果我们要将其包含在 select 列表中,我们还需要按团队的 ID 进行分组。和以前一样,您可以 select 团队名称,因为 ID 是唯一的。
select jogador.nome, equipa.nome, count(id_golo)
from golo
join jogador on jogador_id_jogador = id_jogador
join equipa on equipa_id_equipa = id_equipa
group by jogador.id_jogador, equipa.id_equipa
order by count desc;
最后,如果您想要显示每个球员,即使他们没有进球,请使用 right join jogador
。
selectjogador.nome, equipa.nome, count(id_golo)
from golo
right join jogador on jogador_id_jogador = id_jogador
join equipa on equipa_id_equipa = id_equipa
group by jogador.id_jogador, equipa.id_equipa
order by count desc;
使用 from jogador
更有意义。然后我们可以确保所有球员都出现,即使是那些没有进球和没有球队的球员(如果那是你想要的)。
select jogador.nome, equipa.nome, count(id_golo)
from jogador
left join golo on jogador_id_jogador = id_jogador
left join equipa on equipa_id_equipa = id_equipa
group by jogador.id_jogador, equipa.id_equipa
order by count desc;
我正在尝试为足球网站建立数据库。
这是它的示意图。
我现在正在尝试制作最佳射手页面,并且我已经使用以下代码成功查询了最佳射手,并按降序排列了相应的进球数:
SELECT jogador.nome_jogador, count(nome_jogador)
FROM golo, jogador
where jogador_id_jogador = id_jogador
group by jogador.nome_jogador
order by count desc;~
还有一个加入:
select j.nome as nome_jogador, e.nome as nome_equipa, count(*) cnt_golo
from golo g
inner join jogador j on j.id_jogador = g.jogador_id_jogador
inner join equipa e on e.id_equipa = j.equipa_id_equipa
group by j.id_jogador, e.id_equipa
order by cnt_golo desc;
备注:
始终使用显式连接而不是老式的隐式连接(在
from
子句中使用逗号);这是几十年来的最佳做法使用table别名来缩短查询,并用它们所属的table限定查询中的所有列,因此查询是明确的
正如 Schwern 在评论中指出的那样,您的图表和查询并不完全匹配;这使用图表的列名称
group by
子句使用了未聚合列的table的主键;如果由于某种原因导致问题,您可能需要枚举所有起作用的列:group by j.id_jogador, e.id_equipa, j.nome, e.nome
首先,让我们将其切换为 standard join syntax。
select jogador.nome_jogador, count(id_golo)
from golo
join jogador on jogador_id_jogador = id_jogador
group by jogador.nome_jogador
order by count desc;~
请注意,您应该按 ID 分组,而不是按姓名分组,以防两个玩家重名。因为 ID 是唯一的,所以发现按 ID 分组,但 select 名称。
你计算的是目标,而不是名字。
select jogador.nome, count(id_golo)
from golo
join jogador on jogador_id_jogador = id_jogador
group by jogador.id_jogador
order by count desc;
现在我们可以添加第三个连接了。如果我们要将其包含在 select 列表中,我们还需要按团队的 ID 进行分组。和以前一样,您可以 select 团队名称,因为 ID 是唯一的。
select jogador.nome, equipa.nome, count(id_golo)
from golo
join jogador on jogador_id_jogador = id_jogador
join equipa on equipa_id_equipa = id_equipa
group by jogador.id_jogador, equipa.id_equipa
order by count desc;
最后,如果您想要显示每个球员,即使他们没有进球,请使用 right join jogador
。
selectjogador.nome, equipa.nome, count(id_golo)
from golo
right join jogador on jogador_id_jogador = id_jogador
join equipa on equipa_id_equipa = id_equipa
group by jogador.id_jogador, equipa.id_equipa
order by count desc;
使用 from jogador
更有意义。然后我们可以确保所有球员都出现,即使是那些没有进球和没有球队的球员(如果那是你想要的)。
select jogador.nome, equipa.nome, count(id_golo)
from jogador
left join golo on jogador_id_jogador = id_jogador
left join equipa on equipa_id_equipa = id_equipa
group by jogador.id_jogador, equipa.id_equipa
order by count desc;