成绩排名

  最近田老师面试的时候遇到了成绩排名的问题,在这里给他解答记录下。

  成绩排名分为连续和不连续两种,即成绩相同排名相同,成绩相同但排名不同。由于 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 等逻辑比较。

 

posted @ 2022-04-24 14:34  远走不高飞  阅读(158)  评论(0)    收藏  举报