Хранимая процедура для нарастающего итога - MySQL

Узнай цену своей работы

Формулировка задачи:

Здравствуйте, специалисты! Есть таблица
  `id` mediumint(8) unsigned AUTO_INCREMENT,
  `user` mediumint(8) unsigned,
  `sum` float,
  `total` float
в ней уже есть нужные значения в полях 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 и увеличиваем счётчик изменений. Но хочется ХП, т.к. количество записей будет расти и этот цикл увеличит нагрузку на сервак. Помогите, плз.
Люди, ну помогите же! Неужели такой сложный вопрос для тех, кто с этим сталкивался?

Решение задачи: «Хранимая процедура для нарастающего итога»

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. Алгоритм работы можно описать следующим образом:

  1. Задаются начальные значения переменных @t и @u, которые используются для отслеживания текущего и предыдущего значения user.
  2. Выполняется выборка из таблицы test и подзапроса, который вычисляет нарастающий итог для каждого уникального значения поля user. При этом используется переменная @t для отслеживания общего количества для каждого user.
  3. Результаты выборки подзапроса сохраняются в временную таблицу t1.
  4. Выполняется обновление таблицы test, где значение поля total устанавливается равным значению из временной таблицы t1 для каждого строки, где поле id совпадает со значением из временной таблицы t1. Таким образом, после выполнения данного кода в поле total таблицы test будет содержаться нарастающий итог по полю sum для каждого уникального значения поля user.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.167 из 5
Похожие ответы