我之前问过this关于从球员列表中生成一个排名表的问题,该表包含前3个分数,加上登录用户的分数。该查询如下所示:
SELECT *
FROM
( SELECT a.*
, @rank := @rank+1 rank
FROM users a
JOIN (SELECT @rank:=0) vars
ORDER
BY highscore DESC
, userid
) x
WHERE name = 'jennie'
OR rank <= 3
ORDER
BY rank;由我上一个问题的接受答案提供的This fiddle演示了正在使用的查询。
但是,从技术上讲,该查询提供的rank列的内容是行号,而不是真正的排名-这意味着当两个用户具有相同的分数时,他们将获得不同的排名。我如何给具有相同分数的唯一用户相同的排名-例如,有效的结果将是:
userid name highscore rank
3 harry 50 1
1 james 50 1
0 sam 20 2
4 jenny 7 4发布于 2019-07-22 16:42:05
我能想到的与你的答案最接近的解决方案如下
SELECT a.userid, a.name, a.highscore,
FIND_IN_SET( a.highscore,
(SELECT GROUP_CONCAT( highscore ORDER BY highscore DESC) FROM my_table )) AS rank
FROM my_table a;在这里,GROUP_CONCAT函数用于聚合有序字符串中的所有高分,然后使用FIND_IN_SET函数,我们可以从选定的聚合结果中定位所需分数的位置。
发布于 2019-07-22 16:57:05
试试这个:
SELECT *,
(SELECT COUNT(DISTINCT highscore) FROM my_table r
WHERE s.highscore<=r.highscore) as rank
FROM my_table s
order by rank ASChttps://stackoverflow.com/questions/57141446
复制相似问题