成绩排名
最近田老师面试的时候遇到了成绩排名的问题,在这里给他解答记录下。
成绩排名分为连续和不连续两种,即成绩相同排名相同,成绩相同但排名不同。由于 mysql 并没有 oracle 那样可以直接获取行号的函数,因此需要自定义参数来实现。日常一般也用不到自定义参数,所以了解即可~
新建成绩表,插入数据如下:
SELECT * FROM `score`;
| id | name | score |
| 1 | 张三 | 80 |
| 2 | 李四 | 60 |
| 3 | 王五 | 90 |
| 4 | 赵六 | 30 |
| 5 | 金九 | 90 |
第一种是连续的,成绩相同排名不同的情况
SELECT @rank := @rank + 1 seq, a.* FROM ( SELECT * FROM `score` ORDER BY score DESC ) a, (SELECT @rank := 0) b
得到的排名是这样的

第二种是不连续的,成绩相同排名也相同的情况
SELECT CASE WHEN @score = score THEN @rank WHEN @score := score THEN @rank := @rank +1 END seq, a.* FROM ( SELECT * FROM `score` ORDER BY score DESC ) a, (SELECT @rank := 0,@score := NULL) b
得到的结果是这样的

像 @rank 这样的就是自定义参数,只在当前连接有效,换句话说,打开一个新的窗口是访问不了上一个窗口的自定义参数的!
冒号等是赋值,可以赋常数,也可以赋表的字段值,一旦赋值除非更改,否则不变(像是废话)。
自定义参数也可以拿来和表字段值做比较,也可以像普通的表字段值一样用于 case when 等逻辑比较。
浙公网安备 33010602011771号