我正在尝试查询,我已经在stackof上搜索了一个答案,但没有找到一个符合我需要的答案。
我有一个名为player的表,其中有两列,“nickname”和“score”。
我使用此查询获得前5名玩家:
SELECT nickname, score
FROM player
ORDER BY score DESC LIMIT 5;
我得到的答案是:
nickname - score:
zod - 30
ciao - 20
jiji - 20
mayina - 20
jon - 0.
现在,我想有一个球员的排名,让我们说“jiji”,结果得到3,因为这是名单上的第三个结果。
我试过很多问题,比如
SELECT COUNT(*) AS rank
FROM player
WHERE score >= (SELECT score FROM player WHERE nickname = 'jiji')
但他们总是以“jiji”或“ciao”返回4,这是该表中最后一个得分为20的玩家的排名。
我怎么能换成“jiji”的3个呢?非常感谢你。
最佳答案
使用常用定义,jiji
的排名将是:
SELECT count(*) + 1 AS rank
FROM player
WHERE score > (SELECT score FROM player WHERE nickname = 'jiji');
这将返回“2”,因为分数为30时存在平局。
如果希望每行的秩稳定且不同,则需要一个附加键。一个明显的关键(在本例中)是
nickname
:SELECT count(*) AS rank
FROM player p CROSS JOIN
(SELECT score FROM player WHERE nickname = 'jiji') s
WHERE p.score > s.score or
(p.score = s.score and p.nickname <= 'jiji');