在制作游戏时,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位。我做了哪些更改或者我可以做些什么来产生匹配的结果?
提前感谢您的帮助!
答案 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');