我有下表: 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中更新它?
答案 0 :(得分:2)
我建议您采用以下方式:
Id
在MySQL中使用变量时,切记不保证表达式的求值顺序是真正重要。因此,您需要将变量的所有引用和赋值放入同一表达式中。
在MySQL 8+中,您可以执行以下操作:
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;
答案 1 :(得分:1)
您可以使用以下简单的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