MySQL заполнить пустой столбец

0

У меня есть следующая таблица: MyTable (id, group_column, column_to_fill)

В настоящее время "column_to_fill" пуст, и я хочу заполнить его с помощью целых чисел. Значения должны начинаться с 0 для каждого значения group_column.

Моя таблица выглядит так:

+-----------------------------------+------------+----------------+
|               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
    Вы можете создать хранимую процедуру, используя цикл. Посмотрите на этот ответ: stackoverflow.com/a/16350693/2469308
Теги:
sql-update

2 ответа

2
Лучший ответ

Я бы рекомендовал подходить к этому как:

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;
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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню