首页 > 解决方案 > MySQL - 在最高分列表中排名用户

问题描述

我有一个 MySQL 查询,它选择users表中得分最高的前 3 名球员,然后创建一个额外的列来分配他们的排名:

SELECT s.*, @curRank := @curRank + 1 AS rank
FROM users AS s
JOIN
( SELECT DISTINCT highscore
  FROM users
  ORDER BY highscore DESC
      LIMIT 3
) AS lim
ON s.highscore = lim.highscore 
, (SELECT @curRank := 0) r
ORDER BY s.highscore DESC ;

目前的进展

因此,如果表格如下所示:

userid   name     highscore
0        sam      20
1        james    39
2        jack     10
3        harry    46
4        jennie   7

查询的结果将是这样的:

userid  name    highscore   rank
3       harry   46          1
1       james   39          2
0       sam     20          3

问题

我如何更改此查询,以便它还显示用户及其在结果列表中的排名?例如,如果$userName = "jenny",我怎么能返回:

userid  name    highscore   rank
3       harry   46          1
1       james   39          2
0       sam     20          3
4       jenny   7           5   <-- Add this row and skip jack

编辑:我应该提一下 - 我使用的是 MySQL 5.0.96 版

标签: mysqlsql

解决方案


对于 8.0 之前的版本...

SELECT *
  FROM 
     ( SELECT a.*
            , @i := @i+1 i
         FROM my_table a
         JOIN (SELECT @i:=0) vars
        ORDER 
           BY highscore DESC
            , userid 
     ) x
 WHERE name = 'jennie'
    OR i <= 3
     ORDER 
        BY i;

https://www.db-fiddle.com/f/hYsiCE1bXeTnR2HzoJkKiR/0


推荐阅读