mysql将多个成绩放在一排_MySQL生成成绩排序的总结

本文总结了MySQL中处理成绩排序的三种方法,包括:1) 按成绩和姓名综合排序;2) 处理重复并连续排名;3) 保持重复成绩排名连续。通过示例代码详细解释了每种排序的实现思路。
摘要由CSDN通过智能技术生成

之前在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的理解非常有限,感觉就是暴力解题,如果找到更好的方法会在第一时间跟新,同时也希望各路大神提出建议。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值