为了账号安全,请及时绑定邮箱和手机立即绑定

在MySQL中计算运行总数

在MySQL中计算运行总数

牧羊人nacy 2019-06-16 14:39:40
在MySQL中计算运行总数我有一个MySQL查询:SELECT DAYOFYEAR(`date`)  AS d, COUNT(*) FROM  `orders` WHERE  `hasPaid` > 0GROUP  BY dORDER  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 |这个是可能的吗?
查看完整描述

3 回答

?
杨魅力

TA贡献1811条经验 获得超6个赞

对于您来说,这可能是一个更简单的解决方案,可以防止数据库执行大量的查询。它只执行一个查询,然后在一次传递中对结果做一些计算。

SET @runtot:=0;SELECT
   q1.d,
   q1.c,
   (@runtot := @runtot + q1.c) AS rtFROM
   (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值的列。


查看完整回答
反对 回复 2019-06-16
?
桃花长相依

TA贡献1860条经验 获得超8个赞

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

这将需要一些语法调优(我没有MySQL来测试它),但它向您展示了这个想法。子查询只需返回并将您已经包含在外部查询中的所有新内容加起来,并且它必须对每一行都这样做。

看一看这个问题如何使用联接来完成相同的任务。

用不断增长的数据来解决性能下降的问题:因为有最大值。一年中有366天,我假设您没有针对多年运行此查询,子查询将被评估366次。有了正确的日期索引和hasPaid标志,您就会没事的。


查看完整回答
反对 回复 2019-06-16
?
神不在的星期二

TA贡献1963条经验 获得超6个赞

从MySQL 8开始,您将使用窗口函数对于这种查询:

SELECT dayofyear(`date`) AS d, count(*), sum(count(*)) OVER (ORDER BY dayofyear(`date`))FROM `orders`WHERE `hasPaid` > 0GROUP BY dORDER BY d

在上面的查询中,聚合函数count(*)嵌套在窗口函数中。sum(..) OVER (..),这是可能的,因为SQL中操作的逻辑顺序..如果这太让人费解,您可以很容易地使用派生表或WITH条款要更好地构造查询:

WITH daily (d, c) AS (
  SELECT dayofyear(`date`) AS d, count(*)
  FROM `orders`
  WHERE `hasPaid` > 0
  GROUP BY d)SELECT d, c, sum(c) OVER (ORDER BY d)ORDER BY d


查看完整回答
反对 回复 2019-06-16
  • 3 回答
  • 0 关注
  • 1103 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信