mysql使用自定义序列实现row_number功能

mysql使用自定义序列实现row_number功能

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

话不多说,show you the code:

第一步:建表:

create table grades(`name` varchar(10),`subject` varchar(10),`score` int(10))

第二步:写入数据

insert into grades(name, subject, score)values('小明', '语文', 85),('小华', '语文', 89),('小李', '语文', 91),('小芳', '语文', 93),('小明', '数学', 77),('小华', '数学', 95),('小李', '数学', 83),('小芳', '数学', 88),('小明', '英语', 90),('小华', '英语', 92),('小李', '英语', 85),('小芳', '英语', 88)

数据如下:

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

首先,先排序:

select name, subject, score from gradesorder by subject, score desc

数据如下:

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

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 t2group by subject, scoreorder by subject, score desc

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

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

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 gradesorder by subject, score desc) t1, (select @i:=0, @subject_pre:='') as t2group by subject, scoreorder by subject, score desc) twhere rn=2

最后结果如下:

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

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


__EOF__

本文作者水木青枫
本文链接:https://www.cnblogs.com/bigband/p/15716205.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部