Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 具有排名可变顺序的评分表并保持排名_Mysql - Fatal编程技术网

Mysql 具有排名可变顺序的评分表并保持排名

Mysql 具有排名可变顺序的评分表并保持排名,mysql,Mysql,假设我们有一个体育比赛的分数表: ----------------------------------------- nickname | challenge | score | rank ----------------------------------------- Sporty | 3 | 37283 | 1 Performer | 2 | 32319 | 2 John | 5 | 21

假设我们有一个体育比赛的分数表:

-----------------------------------------
nickname   | challenge |   score   | rank
-----------------------------------------
Sporty     | 3         |   37283   | 1
Performer  | 2         |   32319   | 2
John       | 5         |   21021   | 3
Sandra     | 3         |   12320   | 4 
我使用的查询:

SELECT nickname, 
challenge, 
score, 
@rank := @rank + 1 AS rank FROM rankings,
(SELECT @rank := 0) r
ORDER BY rank desc 
我想对所有列重新排序,但保留按分数排列的列。例如 表格应按昵称排序,如下所示:

-----------------------------------------
nickname   | challenge |   score   | rank
-----------------------------------------
John       | 5         |   21021   | 3
Performer  | 2         |   32319   | 2
Sandra     | 3         |   12320   | 4
sporty     | 3         |   37283   | 1
我使用的是MySQL 5.7,所以我不能使用MySQL 8中的排名功能。 如何实现此目标?

使用子查询:

SELECT nickname, challenge, score, rnk
FROM
(
    SELECT nickname, challenge, score, 
           @rank := @rank + 1 AS rnk
    FROM rankings, (SELECT @rank := 0) r
    ORDER BY rnk DESC
) t
ORDER BY nickname;


这里的想法是首先在子查询中具体化排名列。然后,我们可以通过外面的其他专栏来订购。请注意,我避免使用别名
rank
,因为从MySQL开始,
rank
是一个分析函数的名称。

很好,谢谢。但是,当我尝试在子查询中添加联接时,排序不再正常工作。可能您必须将子查询本身联接到另一个表,然后(第二次)进行子查询以执行所需的排序。如果你有其他要求,我建议你问一个新问题,这个问题已经回答了。