Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何为给定键连接4个表(MYSQL)_Mysql_Sum_Subquery_Inner Join - Fatal编程技术网

如何为给定键连接4个表(MYSQL)

如何为给定键连接4个表(MYSQL),mysql,sum,subquery,inner-join,Mysql,Sum,Subquery,Inner Join,我已经建立了一个足球数据库,现在需要做一些查询,但需要一些建议: So 4表: 球员 管理者 火柴 团队 需要提取显示以下内容的结果: 前100名得分手 球员(姓名)|球队(姓名)|比赛(进球)|经理(姓名) 如果: 玩家表包含playerid,managerid,teamid,name 管理者包含managerid,名称 火柴包含matchid,球员ID,进球 团队包括:teamid,名称 现在我有一些单独的东西,比如: "SELECT players.nam

我已经建立了一个足球数据库,现在需要做一些查询,但需要一些建议:

So 4表:

  • 球员

  • 管理者

  • 火柴

  • 团队

需要提取显示以下内容的结果:

前100名得分手

球员(姓名)|球队(姓名)|比赛(进球)|经理(姓名)

如果:

  • 玩家表包含playerid,managerid,teamid,name

  • 管理者包含managerid,名称

  • 火柴包含matchid,球员ID,进球

  • 团队包括:teamid,名称

现在我有一些单独的东西,比如:

"SELECT players.name, teams.name, matches.goals, managers.name
          FROM players
          INNER JOIN ????
          ORDER BY matches.goals";
那么,假设其他一切都是正确的,我应该在内部联接中放置什么呢


谢谢

您可以加入、聚合或只是加入,并使用子查询计算目标:

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

使用
内部联接
联接表
中匹配键的行

  • 每个
    JOIN
    组合两个表的记录
  • ON
    指定应匹配的列
  • internal
    表示只在记录匹配的地方加入
使用
groupby
对所选(加入的)记录进行分组(聚合)

  • 在GROUP子句中,列出应分组的所有列(仅结果中的不同值)
  • 在选择列表中,您可以使用聚合函数指定可选的聚合列,如
    SUM(goals)
    将列
    goals
    聚合为SUM
带有列(-list)和方向的
排序依据对结果集进行排序(在限制之前)

最后,
LIMIT
关键字后跟多个结果将剪切您的结果集(适用于TOP x查询)。您可能会发现下面格式化的SQL代码中缺少语法突出显示。这是因为这个限制性关键字不是ANSI-SQL标准的一部分

选择
player.name作为player,
team.name作为团队,
manager.name作为经理,
总进球数(比赛进球数)
从比赛
在match.playerid=player.playerid上内部加入玩家
player.managerid=manager.managerid上的内部加入管理器
在player.teamid=team.teamid上加入内部团队
按匹配顺序。目标描述
按player.name、team.name、manager.name分组
上限为100;
注意:总得分是特定组合的所有得分之和,即给定球员在给定教练指导下与给定团队一起得分


我为列添加了带有
as
的别名(否则您可能会在输出中看到多个带有模糊标签的列
name

准确地回答了这个问题。虽然它可能包含重复项,因为没有使用
groupby
进行distint,谢谢@hc_dev的评论,我没有注意到MYSQL标记,或者问题是后来编辑的。再次感谢。sub selelect作为简易附加组件应用。将SUM的结果别名为
cnt_goals
,这里似乎最自然地解释了“目标计数”;不要与常见的使用“cnt_3;”作为计数结果前缀的做法混淆
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;