You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL 5.5.23:如何按规则排序含新/原始收据号的数据

现有Table A(按Id DESC排序)
Idreceiptog_receptis_modify
8XX03-XX04-00000000-BXX03-XX04-000000001
7XX05-XX06-000000000
6XX04-XX05-000000000
5XX02-XX03-00000000-BXX02-XX03-000000001
4XX03-XX04-000000000
3XX01-XX02-00000000-BXX01-XX02-000000001
2XX02-XX03-000000000
1XX01-XX02-000000000
期望结果
Idreceiptog_receptis_modifygroupgroup_order
1XX01-XX02-00000000011
3XX01-XX02-00000000-BXX01-XX02-00000000112
2XX02-XX03-00000000021
5XX02-XX03-00000000-BXX02-XX03-00000000122
4XX03-XX04-00000000031
8XX03-XX04-00000000-BXX03-XX04-00000000132
6XX04-XX05-00000000041
7XX05-XX06-00000000051

需求说明

  • 对receipt列进行排序,先按is_modify=0的记录Id升序排列(Id顺序为1→2→4→6→7)
  • 若存在og_recept不为空字符串且is_modify=1的记录,需将其放置在关联的原始收据记录下方
  • 使用MySQL v5.5.23版本

解决方案

由于MySQL 5.5不支持窗口函数,可通过子查询关联+用户变量实现需求:

SELECT 
    t.Id,
    t.receipt,
    t.og_recept,
    t.is_modify,
    @group_num := CASE 
        WHEN t.is_modify = 0 THEN @group_num + 1 
        ELSE @group_num 
    END AS `group`,
    CASE 
        WHEN t.is_modify = 0 THEN 1 
        ELSE 2 
    END AS group_order
FROM (
    -- 关联原始记录与修改记录,按目标规则预排序
    SELECT a.*
    FROM TableA a
    LEFT JOIN TableA b 
        ON a.og_recept = b.receipt 
        AND a.is_modify = 1 
        AND b.is_modify = 0
    ORDER BY 
        COALESCE(b.Id, a.Id),
        a.is_modify
) t
CROSS JOIN (SELECT @group_num := 0) vars
ORDER BY `group`, group_order;

逻辑说明

  1. 子查询通过自连接,将修改记录(is_modify=1)关联到对应的原始记录(is_modify=0)
  2. 预排序时,优先按原始记录的Id升序排列;无原始记录的按自身Id升序,组内原始记录在前、修改记录在后
  3. 使用用户变量@group_num为每组分配唯一编号:原始记录触发编号递增,修改记录沿用同一编号
  4. group_order直接根据is_modify赋值,原始记录为1,修改记录为2

内容的提问来源于stack exchange,提问作者Jefflee0915

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 12:43:16