我有这样的查询,给出分数和排行榜首字母:
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;
,但是我不知道如何才能获得排名。有任何想法吗?
答案 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;
答案 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