假设有张student表,记录了全级所有班级的所有学生的总成绩 字段 class_id,score,name
class_id | name | score |
---|---|---|
1 | 张三 | 498 |
2 | 李四 | 510 |
3 | 王二 | 520 |
第一种:利用了两层子查询的方式,首先在最外层查询所有列,在里层查询当前列的,班级相等,且分数大于当前列的数量当作排名。
select *, (
select count(distinct score) from student s2 where s2.score >= s1.score and s1.class_id = s2.class_id
) as rank from student s1
第二种:利用了两层子查询和变量,中心思想是,首先对所有列根据班级和分数排序,然后在每个班级中对所有分数累加标记数当作排名。
在最里层首先对班级和分数进行排序,并赋值变量,外层如果班级相等,则rank变量+1,classId变量赋值为当前行的班级id
select
s3.*,
if(@classId=s3.class_id, @rank:=@rank+1, @rank=1),
@classId:=s3.class_id
from
(
select s1.* from student s1,(
select @classId:=null, @rank:=0
) s2 order by s1.class_id, s1.score
) s3