0

在制作游戏时,获取前 10 名的 MySQL 调用如下:

SELECT username, score FROM userinfo ORDER BY score DESC LIMIT 10

这似乎工作得很好,但是当与调用以获得单个玩家的排名配对时,如果玩家与其他玩家的分数相同,则数字可能会有所不同。获取玩家排名的调用如下:

SELECT (SELECT COUNT(*) FROM userinfo ui WHERE (ui.score, ui.username) >= (uo.score, uo.username)) AS rank FROM userinfo uo WHERE username='boddie';

第一次调用的示例结果:

+------------+-------+
| username   | score |
+------------+-------+
| admin      |  4878 |
| test3      |  3456 |
| char       |   785 |
| test2      |   456 |
| test1      |   253 |
| test4      |    78 |
| test7      |     0 |
| boddie     |     0 |
| Lz         |     0 |
| char1      |     0 |
+------------+-------+

第二次调用的示例结果

+------+
| rank |
+------+
|   10 |
+------+

可以看出,第一次调用将玩家排在列表中的第 8 位,但第二次调用将他排在第 10 位。有哪些更改或我可以做些什么来使这些调用产生匹配的结果?

预先感谢您的任何帮助!

4

5 回答 5

2

我会更改您的 Order by 以包含用户名,以便您始终获得相同的订单。所以它看起来像:

... ORDER BY score DESC, username ASC ...
于 2013-07-01T16:03:05.527 回答
2

您需要在第一个查询中:

ORDER BY 
   score DESC,
   username DESC

这样,它将达到第 10 位...这是由于第二个查询中的用户名比较:

(ui.score, ui.username) >= (uo.score, uo.username)

于 2013-07-01T16:03:45.250 回答
1

另一种方法:-

SELECT UsersRank
FROM 
(
    SELECT userinfo.score, userinfo.username, @Rank:=@Rank+1 AS UsersRank
    FROM userinfo 
    CROSS JOIN (SELECT (@Rank:=0)) Sub1
    ORDER BY userinfo.score DESC, userinfo.username
) Sub2
WHERE username = 'boddie'
于 2013-07-01T16:12:11.223 回答
1
SELECT
    uo.username,
    (SELECT COUNT(*)+1 FROM userinfo ui WHERE ui.score>uo.score) AS rank
FROM userinfo uo
WHERE uo.username='boddie'

或者,如果您需要获取用户名、分数和排名:

SELECT
    uo.username,
    uo.score,
    (@row := @row + 1) AS rank
FROM userinfo uo
JOIN (SELECT @row := 0) r
ORDER BY uo.score DESC, uo.username ASC

你可以添加

HAVING uo.username = 'boddie'

只获得一个用户

于 2013-07-01T16:05:56.333 回答
0

尝试这个。

SELECT (COUNT(*)+1) AS rank
FROM   userinfo ui
WHERE  ui.score > (SELECT score
                   FROM   userinfo
                   WHERE  username='boddie');
于 2013-07-01T16:18:46.960 回答