MySQL排名与表中的高分不匹配

MySQL排名与表中的高分不匹配,mysql,leaderboard,scoring,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'; 这似

在制作游戏时,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';
这似乎足够得体,但如果玩家与其他玩家的分数持平,那么当与获取单个玩家排名的电话配对时,数字可能会有所不同。获取玩家等级的调用如下所示:

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位。我可以做什么更改或做什么才能使这些调用产生匹配的结果


提前感谢您的帮助

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

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

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

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

在第一个查询中,您需要:

ORDER BY 
   score DESC,
   username DESC
这样它将达到排名10。。。这是由于第二个查询中的用户名比较造成的:


(ui.score,ui.username)>=(uo.score,uo.username)
您需要在第一次查询中:

ORDER BY 
   score DESC,
   username DESC
这样它将达到排名10。。。这是由于第二个查询中的用户名比较造成的:

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

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

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'
仅获取一个用户

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

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'

要仅获取一个用户,请使用另一种方法:-

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'

另一种方法是:-

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'
试试这个

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

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

Upvote,因为我们在同一分钟内得到了几乎相同的答案,但可能希望名称按字母升序排列,而不是降序排列:)@BryPie您可以通过更改第二个查询来做到这一点。由于简单,使用此选项可以很好地处理我的问题。非常感谢。Upvote,因为我们在同一分钟内得到了几乎相同的答案,但可能希望名称按字母升序排列,而不是降序排列:)@BryPie您可以通过更改第二个查询来做到这一点。由于简单,使用此选项可以很好地处理我的问题。非常感谢。在你的情况下,所有得分为0的用户都将拥有相同的排名:)是的,但你需要一种方法来区分他们,就像OP Triedn一样,不确定使用HAVING作为第二个答案是否安全,因为MySQL可以选择使用用户变量优化查询。在我们的情况下,所有得分为0的用户都将拥有相同的排名:)是的,但你需要一种方法来区分他们,与OP Triedn一样,由于MySQL可以选择使用用户变量优化查询的可能方式,因此使用HAVING作为第二个答案并不一定安全。您可以根据其中的分数desc和用户名desc进行有效排序,因此boddie比Lz和char1Yah低,在看了下面所有伟大的回应之后,我开始看到错误。有这么多好的,hahaYou有效地按照分数desc和用户名desc进行排序,因此boddie低于Lz和char1Yah。在看了下面所有的精彩回复后,我开始看到错误。有那么多好的,哈哈