首页 > 解决方案 > MySQL对具有关系的列进行排名

问题描述

给定具有以下架构的 Scores 表

+----+-------+
| Id | Score |
+----+-------+
| 1  | 3.50  |
| 2  | 3.65  |
| 3  | 4.00  |
| 4  | 3.85  |
| 5  | 4.00  |
| 6  | 3.65  |
+----+-------+

我尝试了以下方法:

SET @prev_value = NULL;
SET @rank_count = 0;
SELECT Id, Score, CASE
    WHEN @prev_value = Score THEN @rank_count
    WHEN @prev_value := Score THEN @rank_count := @rank_count + 1
END AS Rank
FROM Scores
ORDER BY Score

为了得到

+-------+------+
| Score | Rank |
+-------+------+
| 4.00  | 1    |
| 4.00  | 1    |
| 3.85  | 2    |
| 3.65  | 3    |
| 3.65  | 3    |
| 3.50  | 4    |
+-------+------+

但是我得到了这个错误:

Line 3: SyntaxError: near 'SET @rank_count = 0;
SELECT Id, Score, CASE
    WHEN @prev_value := Score THEN @'

我做错了什么?

标签: mysqlsql

解决方案


您可以使用变量。我认为您只需要一个查询:

SELECT Id, Score,
       (CASE WHEN @prev_value = Score THEN @rank_count
             WHEN @prev_value := Score THEN @rank_count := @rank_count + 1
        END) AS Rank
FROM (SELECT s.*
      FROM Scores s
      ORDER BY Score s
     ) s CROSS JOIN
     (SELECT @prev_value := NULL, @rank_count := 0) params;

更新版本的 MySQL 需要在子查询中进行排序。当然,最新版本提供DENSE_RANK()了更好的选择。


推荐阅读