【问题标题】:MySQL fill empty columnMySQL填充空列
【发布时间】:2019-01-18 18:08:27
【问题描述】:

我有下表: MyTable(id, group_column, column_to_fill)

当前“column_to_fill”为空,我想用递增的整数填充它。 group_column 的每个值的值应从 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 中更新它?

【问题讨论】:

标签: mysql sql sql-update


【解决方案1】:

我建议这样处理:

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 中使用变量时,真的要记住,表达式的求值顺序是保证的。所以,你需要把一个变量的所有引用和赋值放到同一个表达式中。

在 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】:

    您可以使用这个简单的SELECT 来达到相同的效果(此外,您可以使用 ut 来更新您的表格):

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-05
      • 2017-08-08
      • 2020-09-01
      • 1970-01-01
      相关资源
      最近更新 更多