mysql使用自定义序列实现row_number功能(步骤详解)

吾爱主题 阅读:146 2024-04-02 18:53:45 评论:0

看了一些文章,终于知道该怎么在 mysql 里面实现 row_number() 排序

话不多说,show you the code:

第一步:建表:

?
1 2 3 4 5 create table grades( ` name ` varchar (10), `subject` varchar (10), `score` int (10) )

第二步:写入数据

?
1 2 3 4 5 6 7 8 9 10 11 12 13 insert into grades( name , subject, score) values ( '小明' , '语文' , 85), ( '小华' , '语文' , 89), ( '小李' , '语文' , 91), ( '小芳' , '语文' , 93), ( '小明' , '数学' , 77), ( '小华' , '数学' , 95), ( '小李' , '数学' , 83), ( '小芳' , '数学' , 88), ( '小明' , '英语' , 90), ( '小华' , '英语' , 92), ( '小李' , '英语' , 85), ( '小芳' , '英语' , 88)

数据如下:

第三步:
需求:找出各科目单科第二的同学

首先,先排序:

?
1 2 3 select name , subject, score from grades order by subject, score desc

数据如下:

然后,每个科目按照分组排序

?
1 2 3 4 5 6 7 8 9 10 11 select (@i:= case when @subject_pre=t1.subject then @i+1 else 1 end ) as rn, t1.*, (@subject_pre:=subject) from (      select name , subject, score      from grades      order by subject, score desc ) t1, ( select @i:=0, @subject_pre:= '' ) as t2 group by subject, score order by subject, score desc

解释一下:
添加一个比较项 subject_pre, 记录前一个科目是什么。
再加上一个自增的序列,实现index+1的功能。
因为数据已经是有序的,如果指向的科目和存储的前一个科目相同,那么序号+1,否则的话,序号从1开始重新计算。
这样就实现了分组排序。

最后,把 rn=2 的数据取出来

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 select name , subject, score from ( select (@i:= case when @subject_pre=t1.subject then @i+1 else 1 end ) as rn, t1. name , t1.subject, t1.score, (@subject_pre:=subject) from ( select name , subject, score from grades order by subject, score desc ) t1, ( select @i:=0, @subject_pre:= '' ) as t2 group by subject, score order by subject, score desc ) t where rn=2

最后结果如下:

这样就使用mysql实现了row_number()的功能。

在网上找的资料,很多没写清楚,这里特地用一个示例把这个实现讲清楚了,希望对你有帮助!

到此这篇关于mysql使用自定义序列实现row_number功能的文章就介绍到这了,更多相关mysql row_number功能内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://www.cnblogs.com/bigband/p/15716205.html

可以去百度分享获取分享代码输入这里。
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

【腾讯云】云服务器产品特惠热卖中
搜索
标签列表
    关注我们

    了解等多精彩内容