之前在leetcode上刷题,遇到一个排序的问题,发现上面的要求和我们平时的排序要求有点区别,然后自己总结了一下其他的排序要求,大致有如下三种,这里分享给大家。
原始表:
Id
Name
Score
1
Mike
90
2
Joe
98
3
Dave
86
4
Abel
98
5
Aimee
99
6
Carrie
92
7
Freda
92
8
Hermosa
92
第一种排序:所有人的排名都不相同,先按成绩排序,然后按姓名排序
Id
Name
Score
Rank
5
Aimee
99
1
4
Abel
98
2
2
Joe
98
3
8
Hermosa
92
4
7
Freda
92
5
6
Carrie
92
6
1
Mike
90
7
3
Dave
86
8
这种排序要求是最简单的,逐个加就可以了,这里给出代码
select Id, Name, Score, Rank from (
select Id,
Name, Score, @Rank:=@Rank+1 as Rank from score
s,
(select @Rank:=0) r
order by
Score desc, Name asc
) t; #偶然摸索出来order可以在不同列上选择降序或升序
第二种排序:这种排序是leetcode上的要求,得到重复并且连续的排名,结果如下
id
Name
Score
Rank
5
Aimee
99
1
4
Abel
98
2
2
Joe
98
2
8
Hermosa
92
3
7
Freda
92
3
6
Carrie
92
3
1
Mike
90
4
3
Dave
86
5
这里比上面稍微复杂了一点,因为需要判断现在的数是否和前一个数相同。如果相同,序号不变;不同,序号加1。所以加个if条件应该可以轻松解决,代码如下
select Id, Name, Score, Rank from (
select Id,
Name, Score, @tempRank := @tempRank + if(@preScore := Score, 0, 1)
as Rank, @preScore := Score from Scores
s,
(select @tempRank:= 0) r, (select @preScore:=
null) p
order by
Score desc, Name asc
) t
第三种排序:这种排序是我们平时用的最多的,即相同排序出现之后的排序自动增加一位,结果如下
id
Name
Score
Rank
5
Aimee
99
1
4
Abel
98
2
2
Joe
98
2
8
Hermosa
92
4
7
Freda
92
4
6
Carrie
92
4
1
Mike
90
7
3
Dave
86
8
这种排序比上面有多了一个工作,在判断重复成绩的同时还要记录重复的次数,结合第一种之后发现如果现在的数不等于上一个数,直接然序号等于第一种排序的序号就可以了,所以代码如下
select Id, Name, Score, Rank from (
select Id,
Name, Score, @AllRank:=@AllRank+1,
@TempRank:=if(@PreScore=Score, @TempScore, @AllRank) as Rank,
#重点在这
@PreScore:=Score from Score s,
(select
@AllRank:=0) a,(select TempRank:=0) t, (select @PreScore:=null)
p
order by
score desc,name asc) m
以上就是三种不同的排序,因为自己对MySQL的理解非常有限,感觉就是暴力解题,如果找到更好的方法会在第一时间跟新,同时也希望各路大神提出建议。