对于每个用户玩的游戏我保存得分(而不是覆盖旧得分)
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,约翰: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_CONCAT函数没有完全返回所有结果,因为结果很大。(它不适合它的CONCAT字符串或其他东西)有没有人知道一种方式获得具有相同效果的人的等级,该效果适用于我想要的数据集?
答案 0 :(得分:0)
你可以做的很简单:
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
子查询只执行一次,因为它不相关