Как реализовать накопительную сумму в поле таблицы используя SET @var = value

Предварительный рабочий код

  1. Создание таблицы:
    CREATE TABLE event(
        event_id INT PRIMARY KEY AUTO_INCREMENT,
        city_id INT,
        city VARCHAR(30),
        genre VARCHAR(30),
        author VARCHAR(30),
        title VARCHAR(30),
        event_day INT,
        num_id INT
        );
  1. Вставка некоторых данных:
    INSERT INTO event(city_id, city, genre)
    SELECT city_id, name_city, name_genre
    FROM city, genre
    ORDER BY city_id;
  1. Далее, я хочу формировать накопление кол-ва дней в поле event_day. Поле event_day для каждой строки содержит суммарное кол-во дней, затраченных на события. Если city_id не меняется, то прибавляю 1, если меняется, то прибавляю 3. Практически, если событие в том же городе, то расходуется 1 день, а если в другом, то тратится 3 дня с учетом переезда.
    SET @day = 0;
    SET @num_id = 1;
    
    UPDATE event 
    SET 
    event_day = 
    IF(city_id = @num_id,
       (@day := @day + 1),
       (@day := @day + 3) AND (@num_id := @num_id + 1))
    ;
SELECT city_id, event_day FROM event;

Получаю почти ожидаемый результат, но проблема в том, что в строках, где event_id = 4 и 7, появляется значение 1 вместо 6 и 11, соответственно.

+----------+---------+-----------+
| event_id | city_id | event_day |
+----------+---------+-----------+
| 1        | 1       | 1         |
| 2        | 1       | 2         |
| 3        | 1       | 3         |
| 4        | 2       | 1         |
| 5        | 2       | 7         |
| 6        | 2       | 8         |
| 7        | 3       | 1         |
| 8        | 3       | 12        |
| 9        | 3       | 13        |
+----------+---------+-----------+

Выглядит как результат True после логической операции. Непонятно, как правильно добавить (@num_id := @num_id + 1) в запрос. Помогите, пожалуйста, разобраться.


Ответы (1 шт):

Автор решения: Maksim Kasakov

Удалось решить задачу через дополнительное поле.

UPDATE event 
SET 
event_day = 
IF(city_id = @num_id,
   @day := @day + 1,
   @day := @day + 3),
num_id = 
IF(city_id = @num_id,
   @num_id,
   @num_id := @num_id + 1)
;

Можно ли решать задачу прямо, без дополнительного поля?

→ Ссылка