在MySQL中计算运行总数

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (57)

我有一个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语句,以便首先初始化正在运行的ALUL变量,否则只会得到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来测试它),但它向你展示了这个想法。子查询只需返回并将您已经包含在外部查询中的所有新内容加起来,并且它必须对每一行都这样做。

通过不断增长的数据来解决对性能退化的关注:因为存在max。一年中有366天,我假设你没有针对多年运行此查询,子查询将被评估366次。有了正确的日期索引和hasPaid标志,你就会没事的。

扫码关注云+社区