代码之家  ›  专栏  ›  技术社区  ›  user1552545

MySQL填充空列

  •  0
  • user1552545  · 技术社区  · 7 年前

    我有下表:

    当前“column_to_fill”为空,我想用递增的整数填充它。组列的每个值都应从0开始。

    +-----------------------------------+------------+----------------+
    |               id                  |group_column| column_to_fill |
    +-----------------------------------+------------+----------------+
    | 9b71dd5c-d8a6-461c-b1f3-af1e4b1d  | Value1     |     null       |
    | 38886977-0f34-4059-b192-f94f5aed  | Value1     |     null       |
    | d98e16da-a919-4242-baf8-dbbef636  | Value2     |     null       |
    | e1ab88a9-3307-49a6-b37d-72cdb5da  | Value2     |     null       |
    | 75174dcb-eb74-4c13-80a1-1b21905d  | Value2     |     null       |
    +-----------------------------------+------------+----------------+
    

    我希望它看起来像这样:

    +-----------------------------------+------------+----------------+
    |               id                  |group_column| column_to_fill |
    +-----------------------------------+------------+----------------+
    | 9b71dd5c-d8a6-461c-b1f3-af1e4b1d  | Value1     |     0          |
    | 38886977-0f34-4059-b192-f94f5aed  | Value1     |     1          |
    | d98e16da-a919-4242-baf8-dbbef636  | Value2     |     0          |
    | e1ab88a9-3307-49a6-b37d-72cdb5da  | Value2     |     1          |
    | 75174dcb-eb74-4c13-80a1-1b21905d  | Value2     |     2          |
    +-----------------------------------+------------+----------------+
    

    如何在MySQL中更新它?

    2 回复  |  直到 7 年前
        1
  •  2
  •   Gordon Linoff    7 年前

    我建议这样做:

    set @rn := -1;
    set @g := '';
    
    update t
        set column_to_fill = if(@g = group_column, @rn := @rn + 1,
                                if(@g := group_column, @rn := 0, @rn := 0)
                              )
        order by group_column;
    

    真正地 重要的是要记住表达式的求值顺序是 放心。因此,您需要将变量的所有引用和赋值放入同一表达式中。

    在MySQL 8+中,您可以执行以下操作:

    update t join
           (select t.*, row_number() over (partition by group_column order by group_column) as seqnum
            from t
           ) tt
           on t.id = tt.id
        set column_to_fill = seqnum - 1;
    
        2
  •  1
  •   Michał Turczyn    7 年前

    使用这个简单的 SELECT

    select @lag := '', @i := 0;
    
    select group_column, rn from (
      select @lag,
             case when group_column = @lag then @i := @i + 1 else @i := 0 end rn,
             @lag := group_column, group_column
      from tbl
    ) a
    

    UPDATE 声明:

    select @lag := '', @i := 0;
    update tbl
    join (
      select id,
             @lag,
             case when group_column = @lag then @i := @i + 1 else @i := 0 end rn,
             @lag := group_column, group_column
      from tbl
    ) t on tbl.id = t.id and tbl.group_column = t.group_column
    set tbl.column_to_fill = t.rn