我正在尝试查询,我已经在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');

08-16 06:18