Хранимая процедура для нарастающего итога - MySQL
Формулировка задачи:
Здравствуйте, специалисты!
Есть таблица
в ней уже есть нужные значения в полях sum.
Нужно для конкретно заданного user пробежаться по его записям и в поля total записать то, что получится, если к предыдущему total добавить текущую sum (но только в том случае, если имеющееся в total значение отличается от рассчитанного), также посчитать, сколько пришлось сделать таких изменений и ещё вернуть последний total
Другими словами, пересчитать нарастающий итог.
Перед началом пробега, считаем, что предыдущий total юзера равен 0.
Ну и, собственно, как это правильно вызвать из php?
Можно было бы циклом программно:
1. выбрать SELECT * FROM " . PAYMENT_TABLE . " WHERE `user`=$user_id";
2. пробежаться циклом по выборке: если $row['total']!==$allSum+$row['sum'], то делаем update и увеличиваем счётчик изменений.
Но хочется ХП, т.к. количество записей будет расти и этот цикл увеличит нагрузку на сервак.
Помогите, плз.
`id` mediumint(8) unsigned AUTO_INCREMENT, `user` mediumint(8) unsigned, `sum` float, `total` float
Люди, ну помогите же!
Неужели такой сложный вопрос для тех, кто с этим сталкивался?
Решение задачи: «Хранимая процедура для нарастающего итога»
textual
Листинг программы
update test t, (SELECT id, if(@u=`user`,5,@t:=0), if(@u=`user`,5,@u:=`user`), @t:=@t+`sum` total FROM test, (select @t:=0, @u:=0) x order by `user`) t1 set t.total=t1.total where t.id=t1.id;
Объяснение кода листинга программы
В данном коде на языке SQL выполняется обновление таблицы test
по значению поля id
. При этом используется подзапрос, который позволяет вычислить нарастающий итог по полю sum
для каждого уникального значения поля user
.
Алгоритм работы можно описать следующим образом:
- Задаются начальные значения переменных
@t
и@u
, которые используются для отслеживания текущего и предыдущего значенияuser
. - Выполняется выборка из таблицы
test
и подзапроса, который вычисляет нарастающий итог для каждого уникального значения поляuser
. При этом используется переменная@t
для отслеживания общего количества для каждогоuser
. - Результаты выборки подзапроса сохраняются в временную таблицу
t1
. - Выполняется обновление таблицы
test
, где значение поляtotal
устанавливается равным значению из временной таблицыt1
для каждого строки, где полеid
совпадает со значением из временной таблицыt1
. Таким образом, после выполнения данного кода в полеtotal
таблицыtest
будет содержаться нарастающий итог по полюsum
для каждого уникального значения поляuser
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д