美文网首页
工作遇到的给sql行记录编号问题

工作遇到的给sql行记录编号问题

作者: yuan_dongj | 来源:发表于2018-05-08 20:30 被阅读0次

前言

最近工作遇到一个需求,定时任务每次查询detail表中100张单据(bill),每张单据的明细记录数量都不一致。

方案一

先查询bill主表前50条单据的billNo,拿billNo匹配detail子表的数据。

SELECT * FROM tbl_chain_bill_detail WHERE billNo in (SELECT billNo FROM tbl_chain_bill_detail group by billNo LIMIT 0, 50)

查询报错:

错误信息.png

limit执行顺序靠后,子查询需要在包装一层。

SELECT * FROM tbl_chain_bill_detail WHERE billNo in (SELECT t.billNo FROM (SELECT billNo FROM tbl_chain_bill_detail group by billNo LIMIT 0, 50) t)

执行成功,但需要两个子查询,不喜欢这个方式。

执行计划.png

方案二

SELECT
    ttt.*,@rank := 0 //锚点A
FROM
    (
        SELECT
            (
                CASE   //锚点B
                WHEN @billNo = t.billNo THEN
                    @rank := @rank
                ELSE
                    @rank := IFNULL(@rank, 0) + 1
                END
            ) AS rank,
            @billNo := t.billNo,  //锚点C
            t.*
        FROM
            tbl_chain_bill_detail t
        ORDER BY
            t.billNo DESC  //锚点D
    ) ttt
WHERE
    ttt.rank <= 500;  //锚点E

思路:
mysql可以定义全局变量,生命周期为整个回话。一个记录每行的billNo,一个作为编号。

  • 锚点D: 首先把detail表按照billNo排序
  • 锚点C: 定义全局变量@billNo,保存每次扫描行记录的billNo,每次扫描行记录@billNo都可能会变化
  • 锚点A: 定义全局变量@rank := 0,每次执行sql @rank都会初始化为0
  • 锚点B: 判断billNo是否等于上一条记录的billNo,如果相等@rank保持不变,否则@rank + 1
  • 锚点E: 对每行记录编好号的sql加记录数限制即可
效果.png

这条sql子查询只有一个,执行计划完爆上面的sql,完美~!

执行计划.png

相关文章

  • 工作遇到的给sql行记录编号问题

    前言 最近工作遇到一个需求,定时任务每次查询detail表中100张单据(bill),每张单据的明细记录数量都不一...

  • 总结一下word里头编号的技巧

    这里记录一下word里编号的技巧。我们在word里码字,经常会遇到编号的问题,这个是word里的基本知识,在编号的...

  • 【SQL实用方案1】将起止有效时间改版为月末版明细数据

    日常处理sql的时候均会遇到类似问题:员工信息表里存在入离职时间,每当有人员变动的时候,底层表中将修改或新增记录行...

  • update和insert...on duplicate key

    记录工作中根据sql返回值执行逻辑时遇到的问题。 update的返回值,如果update语句执行成功,则 affe...

  • sql 工作记录

    接到老板通知,要我统计几个数据。 1,近三个月每个月登录次数少于2的有多少人, 2,近六个月每个月登录次数少于2的...

  • 船舶产品图样和技术文件编号

    在工作中,总会遇到各种各样的图样和文件编号问题,设计定型阶段产生的文件怎么编号?生产阶段产生的文件阶段号是多少……...

  • SQL常遇到的问题

    从一表中多条件update到另一个表 UPDATE a, bSET a.id = b.id,a.name = b....

  • 专升本手札24

    计算机: 1.工作表:行最多1048576,编号1~1048576;列最多16384,编号A~XFD 2.[工作薄...

  • sql 分组 编号

    我现在对用户分组了 如下 a a a a a b b b b b 现在要加上一列 对用户编号 成为如下 a 1 a...

  • Oracle经典实例——高级查询

    1.结果集分页 窗口函数ROW_NUMBER将会为每一行记录分配一个唯一的数字编号(从1开始递增): 有了行编号,...

网友评论

      本文标题:工作遇到的给sql行记录编号问题

      本文链接:https://www.haomeiwen.com/subject/irawrftx.html