我熟悉Oracle并且通常会做一个RANK()(ORDER BY得分DESC)AS级别来获得这样的排名:
Score | Rank
--------------
100 | 1
100 | 1
99 | 3
98 | 4
98 | 4
98 | 4
97 | 7
我没有在MySQL中如何做到这一点最模糊 - 看完这里后,我发现了这个:
SET @prev_value = NULL;
SET @rank_count = 0;
SELECT score
, CASE
WHEN @prev_value = score
THEN @rank_count
WHEN @prev_value := score
THEN @rank_count := @rank_count + 1
END AS rank
FROM ...
但这会将其返回为:
Score | Rank
--------------
100 | 1
100 | 1
99 | 2
98 | 3
98 | 4
98 | 4
97 | 5
这不是我想要的。
答案 0 :(得分:2)
添加另一个变量:
SET @prev_value = NULL;
SET @rank_count = 0;
SET @rank_increasing = 0;
SELECT score
, @rank_increasing := @rank__increasing + 1 AS row_num
, CASE
WHEN @prev_value = score
THEN @rank_count
WHEN @prev_value := score
THEN @rank_count := @rank_increasing
END AS rank
FROM ...
答案 1 :(得分:1)
SELECT score
, FIND_IN_SET(score,(SELECT GROUP_CONCAT(score ORDER BY score DESC) FROM my_scores))
FROM my_scores;
或者,如果你想接近巴马尔查询的速度......
SELECT score
, FIND_IN_SET(score, @vals) rank
FROM my_scores
JOIN (SELECT @vals := GROUP_CONCAT(score ORDER BY score DESC) FROM my_scores) x;
当然GROUP_CONCAT有一定的局限性!