Хранимая процедура для нарастающего итога - 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.