当前位置:  开发笔记 > 编程语言 > 正文

计算MySQL中的运行总计

如何解决《计算MySQL中的运行总计》经验,为你挑选了2个好方法。

我有这个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 |

这可能吗?



1> 小智..:

也许是一个更简单的解决方案,可以防止数据库不得不进行大量查询.这只执行一个查询,然后在一次传递中对结果进行一些数学计算.

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值.


值得一提的是`@ rentot`变量可以在`FROM`子句中的`SELECT`语句中设置如下:`... AS q1,(SELECT @runtot:= 0)AS n`.这可能会让php人员的生活变得更加容易,因为现在你只有一个语句查询.
你工作太辛苦了.下次使用`WITH ROLLUP`.
Ariel,请提供一个工作示例作为帖子的答案,而不是留下飞越.很想知道你的建议是如何运作的!
对于那些想使用PHP的基本MySQL函数执行类似操作的人,请确保单独运行第一行(但仍要在第二行之前)。

2> cdonner..:
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标志,你会没事的.

推荐阅读
ERIK又
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有