zoukankan      html  css  js  c++  java
  • 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 grades
    order 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 t2
    group by subject, score
    order 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 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()的功能。

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

  • 相关阅读:
    解决关于 在android studio 出现的 DELETE_FAILED_INTERNAL_ERROR Error while Installing APK 问题
    oracle 时间日期常用语句及函数
    微信小程序 网络请求之re.request 和那些坑
    微信小程序 网络请求之设置合法域名
    开发中常用js记录(三)
    oracle 锁表 and 解锁
    微信小程序 JS动态修改样式
    微信小程序 获得用户输入内容
    微信小程序 引用其他js里的方法
    微信JSAPI支付回调
  • 原文地址:https://www.cnblogs.com/bigband/p/15716205.html
Copyright © 2011-2022 走看看