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里

mysql 显示分组行号,并更新到表_第1张图片

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;

 

你可能感兴趣的:(group,by,和,order,by)