京东6.18大促主会场领京享红包更优惠

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 9232|回复: 0

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

[复制链接]

23

主题

0

回帖

10

积分

新手上路

积分
10
发表于 2022-1-10 20:31:44 | 显示全部楼层 |阅读模式 来自 中国
看了一些文章,终于知道该怎么在 mysql 里面实现 row_number() 排序
/ ]) y  ^% _$ _$ d话不多说,show you the code:6 x; P) k! d+ R0 T) K7 m, `9 b6 i
第一步:建表:
  1. create table grades(`name` varchar(10),`subject` varchar(10),`score` int(10))
复制代码
第二步:写入数据
  1. insert into grades(name, subject, score)values('小明', '语文', 85),('小华', '语文', 89),('小李', '语文', 91),('小芳', '语文', 93),('小明', '数学', 77),('小华', '数学', 95),('小李', '数学', 83),('小芳', '数学', 88),('小明', '英语', 90),('小华', '英语', 92),('小李', '英语', 85),('小芳', '英语', 88)
复制代码
数据如下:0 ^' w: e1 y2 f4 s6 }

+ R' V, P2 J. ]/ Y& ^3 s7 M第三步:" Z7 q+ _( {. i$ D
需求:找出各科目单科第二的同学0 o6 A  h8 F3 V' P2 B3 |9 Z1 H
首先,先排序:
  1. select name, subject, score from gradesorder by subject, score desc
复制代码
数据如下:9 D& z) W/ @' h! `8 }

3 X, r+ U1 l5 }' A. \$ ?2 R5 G然后,每个科目按照分组排序
  1. 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
复制代码

! _0 c* e& s! T2 X6 g- n1 \. @解释一下:; O$ Z" r; N2 n/ c5 q; J+ i
添加一个比较项 subject_pre, 记录前一个科目是什么。, H; Z4 X- f% C  s
再加上一个自增的序列,实现index+1的功能。
( A7 B' r3 b% H! J  c$ L因为数据已经是有序的,如果指向的科目和存储的前一个科目相同,那么序号+1,否则的话,序号从1开始重新计算。& z" F+ ]7 E; b
这样就实现了分组排序。' _( l0 i0 O4 ]6 K8 Q! m4 L. r5 d2 u
最后,把 rn=2 的数据取出来
  1. 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
复制代码
最后结果如下:
* a. k  M8 S: y7 U1 y/ \

9 ]; n% V- m* ]  C, p8 J这样就使用mysql实现了row_number()的功能。3 a5 Z; j6 u7 ~! l& s6 [! H7 r7 b: I
在网上找的资料,很多没写清楚,这里特地用一个示例把这个实现讲清楚了,希望对你有帮助!( f6 Z+ W# u; ~8 V( h9 _0 I- c
到此这篇关于mysql使用自定义序列实现row_number功能的文章就介绍到这了,更多相关mysql row_number功能内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
0 y- `& E5 E. x/ e3 S" K0 U, V1 A3 c
来源:http://www.jb51.net/article/232555.htm# m/ l6 w1 j  |7 |0 A  W! h4 G* N! R7 j( Q
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

帖子地址: 

梦想之都-俊月星空 优酷自频道欢迎您 http://i.youku.com/zhaojun917
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|梦想之都-俊月星空 ( 粤ICP备18056059号 )|网站地图

GMT+8, 2025-11-12 02:21 , Processed in 0.039707 second(s), 23 queries .

Powered by Mxzdjyxk! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表