MySQL排名不匹配表中的高分

时间:2013-07-01 15:59:30

标签: mysql leaderboard scoring

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

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位。我做了哪些更改或者我可以做些什么来产生匹配的结果?

提前感谢您的帮助!

5 个答案:

答案 0 :(得分:2)

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

... ORDER BY score DESC, username ASC ...

答案 1 :(得分:2)

您需要在第一个查询中:

ORDER BY 
   score DESC,
   username DESC

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

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

答案 2 :(得分: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'

只获得一个用户

答案 3 :(得分: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'

答案 4 :(得分:0)

试试这个。

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