如何为给定键连接 4 个表 (MYSQL)
How to join 4 tables for given keys (MYSQL)
我做了一个足球数据库,现在需要做一些查询,但需要一些建议:
所以 4 tables:
玩家
经理
匹配
团队
需要拉取显示的结果:
前 100 名射手
玩家(姓名) |团队(名称) |比赛(进球) |经理(姓名)
代码会是什么样子如果:
玩家table包含; playerid, managerid, teamid, name
经理包含; 管理员编号,名称
匹配包含; matchid, playerid, goals
团队包含; 团队成员,姓名
现在我有一些单独的内容:
"SELECT players.name, teams.name, matches.goals, managers.name
FROM players
INNER JOIN ????
ORDER BY matches.goals";
假设其他一切都正确,那么我应该在 INNER JOIN 中放入什么?
谢谢!
您可以加入并聚合 - 或者只是加入并使用子查询来计算目标:
select p.name as player_name, t.name as team_name, m.name as manager_name,
(select sum(g.goals) from matches g where g.playerid = p.playerid) cnt_goals
from players p
inner join managers m on m.managerid = p.managerid
inner join teams t on t.teamid = p.teamid
order by cnt_goals desc limit 100
SELECT P.name,
T.name,
MA.goals,
M.name
FROM matches MA
INNER JOIN players P
ON MA.playerid = P.playerid
INNER JOIN managers M
ON P.managerid = M.managerid
INNER JOIN teams T
ON P.teamid = T.teamid
ORDER BY MA.goals DESC
LIMIT 100;
使用INNER JOIN
连接来自表ON
匹配键.
的行
- 每个
JOIN
合并了两个表的记录
ON
指定应匹配的列
INNER
表示,仅在记录匹配的地方加入
使用 GROUP BY
对您选择(加入)的记录进行分组(聚合)。
- 在 GROUP 子句中列出所有应分组的列(仅结果中的不同值)
- 在 select-list 中,您可以使用 [=73= 指定可选的 聚合列 ],如
SUM(goals)
将列 goals
聚合为 sum
具有列(-列表)和方向的ORDER BY
排序result-set(限制之前).
最后 LIMIT
关键字后跟 个结果 削减了你的 result-set(适用于 TOP x 查询)。您可能会发现下面格式化的 SQL 代码中缺少 syntax-highlighting。这是因为 limiting-keyword 不是 ANSI-SQL 标准的一部分。
SELECT
player.name as player,
team.name as team,
manager.name as manager,
SUM(match.goals) as scored_goals
FROM Matches match
INNER JOIN Players player ON match.playerid = player.playerid
INNER JOIN Managers manager ON player.managerid = manager.managerid
INNER JOIN Teams team ON player.teamid = team.teamid
ORDER BY match.goals DESC
GROUP BY player.name, team.name, manager.name
LIMIT 100;
注意: 总计 scored_goals
是给定球员拥有的 特定组合 所有进球的总和在给定经理的给定团队中得分。
我为列添加了带有 as
的别名(否则您可能会在输出中看到多个含糊不清的标记列 name
)。
我做了一个足球数据库,现在需要做一些查询,但需要一些建议:
所以 4 tables:
玩家
经理
匹配
团队
需要拉取显示的结果:
前 100 名射手
玩家(姓名) |团队(名称) |比赛(进球) |经理(姓名)
代码会是什么样子如果:
玩家table包含; playerid, managerid, teamid, name
经理包含; 管理员编号,名称
匹配包含; matchid, playerid, goals
团队包含; 团队成员,姓名
现在我有一些单独的内容:
"SELECT players.name, teams.name, matches.goals, managers.name
FROM players
INNER JOIN ????
ORDER BY matches.goals";
假设其他一切都正确,那么我应该在 INNER JOIN 中放入什么?
谢谢!
您可以加入并聚合 - 或者只是加入并使用子查询来计算目标:
select p.name as player_name, t.name as team_name, m.name as manager_name,
(select sum(g.goals) from matches g where g.playerid = p.playerid) cnt_goals
from players p
inner join managers m on m.managerid = p.managerid
inner join teams t on t.teamid = p.teamid
order by cnt_goals desc limit 100
SELECT P.name,
T.name,
MA.goals,
M.name
FROM matches MA
INNER JOIN players P
ON MA.playerid = P.playerid
INNER JOIN managers M
ON P.managerid = M.managerid
INNER JOIN teams T
ON P.teamid = T.teamid
ORDER BY MA.goals DESC
LIMIT 100;
使用INNER JOIN
连接来自表ON
匹配键.
- 每个
JOIN
合并了两个表的记录 ON
指定应匹配的列INNER
表示,仅在记录匹配的地方加入
使用 GROUP BY
对您选择(加入)的记录进行分组(聚合)。
- 在 GROUP 子句中列出所有应分组的列(仅结果中的不同值)
- 在 select-list 中,您可以使用 [=73= 指定可选的 聚合列 ],如
SUM(goals)
将列goals
聚合为 sum
具有列(-列表)和方向的ORDER BY
排序result-set(限制之前).
最后 LIMIT
关键字后跟 个结果 削减了你的 result-set(适用于 TOP x 查询)。您可能会发现下面格式化的 SQL 代码中缺少 syntax-highlighting。这是因为 limiting-keyword 不是 ANSI-SQL 标准的一部分。
SELECT
player.name as player,
team.name as team,
manager.name as manager,
SUM(match.goals) as scored_goals
FROM Matches match
INNER JOIN Players player ON match.playerid = player.playerid
INNER JOIN Managers manager ON player.managerid = manager.managerid
INNER JOIN Teams team ON player.teamid = team.teamid
ORDER BY match.goals DESC
GROUP BY player.name, team.name, manager.name
LIMIT 100;
注意: 总计 scored_goals
是给定球员拥有的 特定组合 所有进球的总和在给定经理的给定团队中得分。
我为列添加了带有 as
的别名(否则您可能会在输出中看到多个含糊不清的标记列 name
)。