SELECT score
CASE
WHEN @preScore = score THEN @curRank
WHEN @preScore := score THEN @curRank:=@curRank +1
END AS `Rank`/*Rank是关键字,加个``或者写成其他rankk*/
FROM score,(SELECT @curRank := 0 AS curRank, @preScore := NULL AS preRank) i
ORDER BY score DESC
结果
score rank
109 1
99 2
89 3
69 4
59 5
@preScore 这种是变量声明,类似之前的set ,set @a = 1;
:= 赋值,@preScore := 1,表示给@preScore赋值为1;
1. 先按照score倒序排列,即score最大的一行,第一名的一条记录;
2. 先判断@preScore是否跟当前查询出来的score一致n,因为默认@preScore为null,那不一致,不执行THEN后面的;
3. 进入到第二个WHEN,THEN中
4. 将当前查询出来的score=99赋值给@preScore,没有判断条件直接进入到THEN,@curRank=0+1,为1
5. 将@curRank 写为别名Rank=1
6. 第二条记录扫描
7. 先判断@preScore(此时为99)跟第二条记录的score(此时为89)对比,不相等,不执行THEN后面的数据;
8. 将当前查询出来的score=89赋值给@preScore,没有判断条件直接进入到THEN,@curRank=1+1,为2
9. 将@curRank 写为别名Rank=1
扫描完所有的记录后得到上表
case函数只返回第一个符合条件的值,剩下的case部分将会被自动忽略。
当有score一样的情况时,@preScore=score时,@curRank并没有做+1操作,所以就有了并列的情况
原始表:
name score
a 59
b 89
c 99
d 69
e 109