mysql 显示分组行号,并更新到表

表内新增了一列用来设置排序的,但是有不同的分组,每个分组都要有自己的序号;

SELECT 
    main.`id`,
    IF(@gid <> `group_id`, @rowNo := 0, @rowNo := @rowNo + 1) as rowNo, 
    -- 注意顺序,修改分组ID的一定要在修改行号之后
    IF(@gid <> `group_id`, @gid := `group_id`, @gid) as gid 
FROM
    (select * from tb_x order by `group_id`, `id` ) main, -- 主表一定要进行分组排序,并且一定要写成子查询(原因后边会说)
    (select @rowNo := 0, @gid := -1) r

查询出来没有问题,然后再准备把rowNo更新到表的sort_no里

update tb_x main 
 JOIN (
    SELECT 
        main.`id`,
        IF(@gid <> `group_id`, @rowNo := 0, @rowNo := @rowNo + 1) as rowNo, 
        IF(@gid <> `group_id`, @gid := `group_id`, @gid) as gid 
    FROM
        (select * from tb_x where deleted = 0 order by `group_id`, `id` ) main, 
        (select @rowNo := 0, @gid := -1) r
        -- 这个主表(tb_x)现在是子子查询了,如果这里不写成子查询 而是最后写成,
        -- tb_x main where main.deleted = 0 order by main.group_id, main.id
        -- 那么这个order by会失效,数据更新之后同一个组内会出现重复序号
) r on main.id = r.id
set main.sort_no = r.rowNo;

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值