如何使用max函数重写此“无效使用组函数”查询以查找排名

时间:2019-04-05 18:36:11

标签: mysql

我有这样的查询,给出分数和排行榜首字母:

sort

sort有一个主键select MAX(score) as score, leaderboard_initials from players p, games g where p.google_id = g.google_id group by p.google_id order by MAX(score) DESC; ,它是Players中的外键。

有效。

我需要显示玩家的排名,其中要考虑他们的最高得分游戏。

我认为,对于这个排名,我需要1 +此球员以上的人数。因此,该玩家的最高得分高于该玩家。因此,我尝试了以下操作,但收到错误google_id

games

我知道我不能在invalid use of group function中使用select 1+(SELECT count(DISTINCT p2.google_id) from players p2, games g2 where MAX(g2.score) > score) as rank, MAX(score) as score, leaderboard_initials from players p, games g where p.google_id = g.google_id group by p.google_id order by MAX(score) DESC; ,但是我不知道如何才能获得排名。有任何想法吗?

2 个答案:

答案 0 :(得分:1)

尝试这样的事情:

SELECT p.google_id, p.leaderboard_initials, bestScores.maxScore
  , COUNT(DISTINCT others.google_id) + 1 AS playerRank
FROM (
   SELECT google_id, MAX(score) AS maxScore
   FROM games
   GROUP BY google_id
) AS bestScores
INNER JOIN players AS p 
   ON bestScores.google_id = p.google_id
LEFT JOIN games AS others 
   ON bestScores.google_id <> others.google_id
   AND bestScores.maxScore < others.score
GROUP BY p.google_id, p.leaderboard_initials, bestScores.maxScore;
  • 首先要找到每个玩家(子查询)的最高分,
  • 然后获取玩家信息(INNER JOIN玩家),
  • 然后获得其他玩家(所有加入LEFT JOIN游戏的玩家)得分更高的分数
  • 最后,它计算得分较高的独立玩家的数量

答案 1 :(得分:1)

有几种方法。

例如,在SELECT列表中使用相关子查询来获取排名:

 SELECT r.score
      , r.leaderboard_initials
      , ( SELECT 1+COUNT(DISTINCT s.google_id) 
           FROM games s
          WHERE s.score > r.score
        ) AS rank_
   FROM ( SELECT MAX(g.score) AS score
               , p.leaderboard_initials
               , p.google_id
            FROM players p
            JOIN games g
              ON g.google_id = p.google_id
           GROUP
              BY p.google_id
        ) r
  ORDER
     BY r.score DESC