【问题标题】:Using INNER JOIN and MAX(), to return same row as MAX使用 INNER JOIN 和 MAX(),返回与 MAX 相同的行
【发布时间】:2013-08-26 15:46:24
【问题描述】:

由于某种原因,我无法让此查询返回我正在寻找的结果。我会在概述情况后解释...

有两张桌子,一张用于玩家,一张用于比赛。在每场比赛中,球员都会根据他们所处的位置获得评分(浮动/小数)。这个评分可能会在一个位置上有所提高,但在其他位置上可能会有所不同/更好。因此,我希望能够看到 MAX(rating) 和获得最大值的 pos以及玩家详细信息

所以,我的想法是做以下事情:

SELECT * 
FROM   players 
       INNER JOIN(SELECT pid, 
                         Max(rating) AS a, 
                         pos 
                  FROM   matches 
                  GROUP  BY pid) b 
               ON b.pid = players.ypid 
WHERE  players.ytid = '2010591' 
   AND players.status = '1' 
ORDER  BY ypromdate ASC, 
          ydob ASC 

这确实会返回所有球员的详细信息和最高评分,但是如果球员参加了多场比赛(因此是 GROUP BY),则返回 pos 的第一条记录。例如,如果 player1 作为后卫获得 5 分,然后作为前锋获得 6 分,则此查询将返回 6 后卫

如果需要更多信息,我很乐意提供!

提前谢谢..感觉好像我把查询弄错了..

编辑以帮助回答发布的问题:

软件:MySQL

Apache/2.2.15 (CentOS)

数据库客户端版本:libmysql - 5.1.69

样本数据,减少以节省时间:

匹配表:id、matchid、matchdate、位置、播放时间、评分、pid
(149, 77221704, '2013-08-12 15:00:00', 100, 90, 1.5, 143569504),

(150, 77221705, '2013-09-12 15:00:00', 103, 90, 3, 143569504)

玩家表:pid、ytid、状态 (143569504, 2010591, 1)

预期结果:

pid, ytid, status, pos, Max(rating) 143569504、2010591、1、103、3

目前的结果:

pid, ytid, status, pos, Max(rating) 143569504、2010591、1、100、3

【问题讨论】:

  • 一些示例数据和所需的输出会有所帮助,另外,您使用的是什么数据库(MySQL、SQL Server 2008 等)?
  • 它的 mysql,没有其他东西可以通过子查询在组中选择 pos。而 pos 的存在是获得错误值的主要原因。
  • 见上文进行编辑,希望对您有所帮助

标签: sql group-by subquery max inner-join


【解决方案1】:

这样的东西应该可以工作

select yourfields (not all of them)
from players p join matches m on m.pid = p.pid
join (select pid, max(rating) maxrating
from matches
group by pid) temp  on p.pid = temp.pid and rating = maxrating
etc

【讨论】:

  • 这正是我要求它做的事情,我将立即接受并标记它。最后一个让你难以置信的请求..运行此查询给了我:显示第 0 - 16 行(总共 17 行,查询耗时 252.0127 秒)。这是由于我的数据库结构还是查询本身造成的时间滞后?如果是后者,这可以改进吗?感谢您解决问题!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-18
  • 1970-01-01
  • 2019-03-21
  • 2014-11-15
  • 2016-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多