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

PHP/MYSQL:highscores获得当前玩家的排名,得分很多。(每个玩家多个),php,mysql,sql,Php,Mysql,Sql,对于每个游戏,用户的“我保存分数”(不覆盖旧分数) 职级将为: 汉克:13,约翰:12,汤姆:8 因此,为了进入前100名球员,我做了以下几点: SELECT id, name, date, userId, MAX(score) as score FROM scores GROUP BY userId ORDER BY MAX(score) DESC LIMIT 100 由于返回数据的顺序,我知道这100个人的排名 然而,当我想要获得当前用户ID的排名时,它变得更加困难,现在我使用: S

对于每个游戏,用户的“我保存分数”(不覆盖旧分数)

职级将为: 汉克:13,约翰:12,汤姆:8

因此,为了进入前100名球员,我做了以下几点:

SELECT id, name, date, userId, MAX(score) as score 
FROM scores 
GROUP BY userId 
ORDER BY MAX(score) DESC LIMIT 100
由于返回数据的顺序,我知道这100个人的排名

然而,当我想要获得当前用户ID的排名时,它变得更加困难,现在我使用:

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字符串或其他内容)有人知道一种方法可以获得一个人的等级,这种效果与我想要的数据集一样大吗?

你可以做得相当简单:

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

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

如何定义秩?秩被定义为具有最高点的秩。排名不存储在数据库中,根据我收集的数据,排名应为球员在按分数排序的所有球员列表中的“条目”。顺便说一句,select语句也有一个错误(Order by MAX(score)DESC应该是Order by score DESC)。。。。。最高(分数)可能会产生不必要的麻烦,因此4名分数为8,4,2的球员将是8名1等4名2等2等3等(顺便说一句,matthy最好将其作为一个例子,以便在等级如何定义的问题中一眼就可以看出)嗨,thomas,这是正确的,我将在问题中添加一个演示表以供参考HX以帮助Gervs,但它给出了以下错误:#1242-子查询返回的行数超过1行抱歉太快了,当然需要组concat。我编辑了我的答案如果你对记录被截断有问题,你可以将group_concat_max_len设置为一个更高的值x Gervs设置的group_concat_max_len有效,但是查询不起作用,因为当两个以上的人共享相同的分数时,它会变差,比如说,当我们的分数为85、85、78时,78应该是哪个级别?
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