PHP / MYSQL:highscores获得了很多分数的当前玩家的排名。 (每位玩家多个)

时间:2014-09-25 13:45:11

标签: php mysql sql

对于每个用户玩的游戏我保存得分(而不是覆盖旧得分)

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字符串或其他东西)有没有人知道一种方式获得具有相同效果的人的等级,该效果适用于我想要的数据集?

1 个答案:

答案 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

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