【问题标题】:Select Max() of SUM() for a Group为组选择 SUM() 的 Max()
【发布时间】:2020-05-06 11:24:54
【问题描述】:
SELECT tname , pname , SUM(Goals)
FROM team as t , player as p , matches as m 
WHERE t.TID=p.TID AND p.PNB=m.PNB
Group BY pname , tname
ORDER BY `SUM(Goals)`  DESC

我只需要选择在每支球队中进球较多的球员。例如,它将只显示来自 F.C Barcelona 的 Luis Suarez 和来自 SEVILLA 的 Munir ....

【问题讨论】:

  • “卡里姆·本泽马”怎么样?为什么他不在结果中?
  • 是的,我的意思是所有列表 karim、morata 和 reus
  • 如果您的桌面玩家数据库中有两个相同的玩家号码怎么办?球员编号不能是您将用于加入表匹配以检查目标的列吗?
  • PNB是唯一的,不能相同
  • 您使用的是哪个版本的 MySQL?

标签: mysql sql select sum max


【解决方案1】:

使用正确、明确、标准 JOIN 语法。 20 年前,逗号已被取代。

然后,你需要窗口函数:

SELECT tp.*
FROM (SELECT t.tname, p.pname, SUM(m.Goals) as goals,
             RANK() OVER (PARTITION BY t.tname ORDER BY SUM(m.Goals) DESC) as seqnum
      FROM matches m JOIN
           team t
           ON t.TID = p.TID JOIN
           player p  
           ON p.PNB = m.PNB
      GROUP BY p.pname, t.tname
     ) tp
WHERE seqnum = 1
ORDER BY goals DESC;

这将返回所有具有最高值的玩家。如果您只想要一行,请使用ROW_NUMBER() 而不是RANK()

【讨论】:

  • 你能解释一下seqnum = 1是什么意思吗?谢谢
  • @feyiz beik:RANK 对行进行排名,为每支球队排名第一的最佳球员。该等级获得别名seqnum。因此WHERE seqnum = 1 的意思是“只展示最好的”。
  • @feyizbeik 这工作得很好。也许连接有点错误,但这是正确的方法。可以这样加入:FROM team t join player p on t.TID=p.TID join matches m on p.PNB=m.PNB
  • tp 是子查询的别名。 MySQL 中的每个子查询都必须有一个别名。另外,如果我没记错的话,别忘了你也可以投票给答案:) 不只是接受它......
  • 如果一支球队的球员目标相同,我如何限制只显示一名球员。
猜你喜欢
  • 2015-09-03
  • 1970-01-01
  • 2011-12-15
  • 1970-01-01
  • 2021-12-19
  • 1970-01-01
  • 2011-02-27
  • 2020-09-13
  • 1970-01-01
相关资源
最近更新 更多