在MySQL8.0以下版本,由于没有窗口函数导致MySQL进行分组排序问题特别复杂,废话不多说,先说表,新建一学生成绩表----student_score
学生姓名 | student_name |
学生班级 | class |
分数 | score |
MySQL8.0
MySQL8.0 有了窗口函数,就可以使用序号函数 rank() ,over是关键字,用来指定函数执行的窗口范围括号里指定用partition by 进分组,order by 进行排序
select score,class,student_name RANK() over (partition by class order by score desc) from student_score
MySQL8.0以下版本
MySQL低版本没有虽然没有窗口函数,但是我们可以使用MySQL的另一个功能---变量,来实现分组排序功能
SELECT
score,class,student_name
CASE
WHEN class = @last_class THEN
@group_count := @group_count + 1
else
@group_count := 1
END AS group_count,
CASE
WHEN class = @last_class THEN
IF(score=@last_score ,@rank := @rank, @rank := @group_count)
else @rank :=@group_count
END AS rank,
@last_class := class,
@last_score := score
FROM
student a,
( SELECT @last_class := '', @rank := 1, @group_count := 1, @last_score := 0 ) T
where score is not null
ORDER BY
class,
score DESC
说一下具体思路,其实很简单,就是通过每组的个数,来对每一组不同分数来进行标记排序,不了解变量的可以自行搜索,我这里就不做过多解释