Как реализовать накопительную сумму в поле таблицы используя SET @var = value
Предварительный рабочий код
- Создание таблицы:
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
);
- Вставка некоторых данных:
INSERT INTO event(city_id, city, genre)
SELECT city_id, name_city, name_genre
FROM city, genre
ORDER BY city_id;
- Далее, я хочу формировать накопление кол-ва дней в поле 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)
;
Можно ли решать задачу прямо, без дополнительного поля?