我有这个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标志,你会没事的.