【问题标题】:MySQL - Assign same rank to users with the same scoreMySQL - 为具有相同分数的用户分配相同的排名
【发布时间】:2019-07-22 07:58:07
【问题描述】:

我之前向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

【问题讨论】:

  • 这取决于你,但我认为这样存储领带更常见:1,1,3,4,4,4,7

标签: mysql


【解决方案1】:

我能想到的最接近您的答案的解决方案如下所示

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函数我们可以从选定的聚合结果中定位我们想要的分数的位置。

【讨论】:

    【解决方案2】:

    试试这个:

    SELECT *,
    (SELECT COUNT(DISTINCT highscore) FROM my_table r
    WHERE s.highscore<=r.highscore) as rank
    FROM my_table s
    order by rank ASC
    

    https://www.db-fiddle.com/f/nypySJqctEdemBAy3a3mp3/1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-18
      相关资源
      最近更新 更多