对于用户玩的每一场游戏,我都会保存分数(而不是覆盖旧分数)
ID Name UserId Score
1 tom 1 8
2 john 2 12
3 hank 3 13
4 hank 3 1
5 tom 1 5
等级为:1汉克:13,2约翰:12,3汤姆:8
因此,为了达到前100名的玩家,我做了以下事情:
SELECT id, name, date, userId, MAX(score) as score
FROM scores
GROUP BY userId
ORDER BY MAX(score) DESC LIMIT 100
由于返回数据的顺序,我认识这100人的排名。
然而,当我想获得当前userId的排名时,它变得更难了,现在我使用:
SELECT id, name, score, date, userId, FIND_IN_SET( score, (
SELECT GROUP_CONCAT( score
ORDER BY score DESC )
FROM
(
SELECT MAX( score ) AS score
FROM scores
GROUP BY userId
ORDER BY MAX( score )
) AS T
)) AS rank
FROM scores
WHERE userId = '$_POST[userId]'
ORDER BY score DESC
LIMIT 0 , 1
这一切起初似乎都很好,但现在我和很多球员一起测试了一下。排名较低的玩家似乎都有0的等级(未找到等级)
我发现GROUP_CONCT函数并没有完全返回所有结果,因为结果太大了(它不适合它的CONCAT字符串或其他什么)有人知道一种方法来获得一个人的排名吗?这种方法在我想要的这么大的数据集上具有同样的效果?
您可以做相当简单的事情:
SELECT
score,
FIND_IN_SET(score,
(SELECT GROUP_CONCAT(DISTINCT score ORDER BY score DESC) FROM scores)
) rank
FROM
scores
WHERE
userId = 3
ORDER BY score DESC
子查询只执行一次,因为它与不相关