PHP/MYSQL:高分获得当前玩家的排名.(每个玩家多个)


PHP/MYSQL: highscores get rank of current player with a lot of scores. (multiple per player)

对于用户玩的每一场游戏,我都会保存分数(而不是覆盖旧分数)

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

子查询只执行一次,因为它与不相关