Вычислить текущую сумму в MySQL

У меня есть этот запрос MySQL:

SELECT DAYOFYEAR(`date`) AS d, COUNT(*) FROM `orders` WHERE `hasPaid` > 0 GROUP BY d ORDER BY d 

Что возвращает что-то вроде этого:

 d | COUNT(*) | 20 | 5 | 21 | 7 | 22 | 12 | 23 | 4 | 

То, что мне действительно понравилось, – это еще один столбец в конце, чтобы показать общее количество:

 d | COUNT(*) | ??? | 20 | 5 | 5 | 21 | 7 | 12 | 22 | 12 | 24 | 23 | 4 | 28 | 

Это возможно?

Возможно, более простое решение для вас и препятствует тому, чтобы база данных выполняла тонну запросов. Это выполняет только один запрос, а затем делает небольшую математику по результатам за один проход.

 SET @runtot:=0; SELECT q1.d, q1.c, (@runtot := @runtot + q1.c) AS rt FROM (SELECT DAYOFYEAR(`date`) AS d, COUNT(*) AS c FROM `orders` WHERE `hasPaid` > 0 GROUP BY d ORDER BY d) AS q1 

Это даст вам дополнительный столбец RT (общий итог). Не пропустите инструкцию SET сверху, чтобы сначала инициализировать текущую общую переменную, или вы получите столбец значений NULL.

 SELECT DAYOFYEAR(O.`date`) AS d, COUNT(*), (select count(*) from `orders` where DAYOFYEAR(`date`) <= d and `hasPaid` > 0) FROM `orders` as O WHERE O.`hasPaid` > 0 GROUP BY d ORDER BY d 

Это потребует некоторой синтаксической настройки (у меня нет MySQL для ее проверки), но она показывает вам эту идею. Подзапрос просто должен вернуться и добавить все свежее, что вы уже включили во внешний запрос, и это нужно сделать для каждой строки.

Взгляните на этот вопрос, как использовать соединения для достижения того же.

Чтобы решить проблемы с ухудшением производительности с ростом данных: поскольку существует макс. 366 дней в году, и я предполагаю, что вы не выполняете этот запрос в течение нескольких лет, подзапрос будет оцениваться до 366 раз. При правильных показателях даты и флага hasPaid вы будете в порядке.

Я бы сказал, что это невозможно, чтобы каждая результирующая строка была независимой. Используйте язык программирования для получения этих значений

Если у вас нет другого выбора, кроме как сделать это в sql, я бы суммировал результаты на языке программирования, который делает запрос. Подобная игра будет очень медленной, так как таблица растет.

Вы можете взломать это с помощью инструкции Cross Join или некоторых подключений slaf, но она будет медленной с любыми большими наборами данных, которые, вероятно, лучше всего выполняются в процессоре почтовых запросов; либо курсор кода клиента

Это одно из мест, где курсоры быстрее, чем заданные на основе запросов, если производительность критическая, я бы либо

  • Сделайте это за пределами MySql или
  • Используйте MySql 5 Cursors