一、mysql8.0以下
1、同分不同名
select name,score,ranking from (
select
name,
score,
@num3:=@num3+1 as ranking
from
(select id,name,score from user_score order by score desc) us,
(select @num3:=0) s
) t
2、同分同名
select name,score,ranking from (
select
name,
score,
@num1:=(case when @num2=score then @num1 else @num3 end) as ranking,
@num3:=@num3+1,
@num2:=score
from
(select id,name,score from user_score order by score desc) us,
(select @num1:=0,@num2:=null,@num3:=1) s
) t
解析1:
(select @num1:=0,@num2:=null,@num3:=1) s
初始化三个变量,等同于在sql最前面写“set @num1=0; ”:
@num1:记录当前排名
@num2:记录分数
@num3:记录真实排名
解析2:
@num1:=(case when @num2=score then @num1 else @num3 end)
如果当前变量@num2记录的分数(row-1 行)与当前这一行(row 行)的分数一样,则代表排名一致,用变量@num1记录的排名(也就是 row-1 行的排名)
解析3:
(select id,name,score from user_score order by score desc) us
将需要排名的数据进行排序
二、mysql8.0以上
前往:
《sql 四大排名函数—(ROW_NUMBER、RANK、DENSE_RANK、NTILE)简介》