表统计(也就是行数)随着时间的推移

时间:2014-07-01 14:10:56

标签: mysql database

我准备了一个关于我们其中一个应用程序的演示文稿并且问自己以下问题:"根据我们数据库中存储的数据,过去几年发生了多少增长?" #34;

所以我想基本上在一个输出/图表中显示自项目开始以来我们存储了多少数据。

我当前的查询如下所示:

SELECT DATE_FORMAT(created,'%y-%m') AS label, COUNT(id) FROM table GROUP BY label ORDER BY label;

示例输出将是:

  • 11-03:5
  • 11-04:200
  • 11-05:300

不幸的是,这个查询缺少了积累。我希望收到以下结果:

  • 11-03:5
  • 11-04:205(200 + 5)
  • 11-05:505(200 + 5 + 300)

有没有办法在mysql中解决这个问题,而不需要在php循环中调用查询?

1 个答案:

答案 0 :(得分:1)

是的,有办法做到这一点。一种方法使用MySQL用户定义的变量(以及无法保证的行为)

SELECT s.label
     , s.cnt
     , @tot := @tot + s.cnt  AS running_subtotal
  FROM ( SELECT DATE_FORMAT(t.created,'%y-%m') AS `label`
              , COUNT(t.id) AS cnt
           FROM articles t
          GROUP BY `label`
          ORDER BY `label`
       ) s
 CROSS
  JOIN ( SELECT @tot := 0 ) i

让我们解开一点。

作为s别名的内联视图返回与原始查询相同的结果集。

别名为i的内联视图返回单行。我们并不关心它返回什么(除了因为JOIN操作我们需要它返回一行);我们关心的是副作用,将零值分配给@tot用户变量。

由于MySQL将内联视图实现为派生表,因此在外部查询运行之前,该变量在外部查询运行之前被初始化。

对于外部查询处理的每一行,cnt的值都会添加到@tot

SELECT列表中s.cnt的返回完全是可选的,它就在那里作为演示。

N.B。 MySQL参考手册明确指出不保证用户定义变量的这种行为。