我正在准备一个有关我们的应用程序的演示文稿,并问自己以下问题:“基于存储在我们数据库中的数据,过去几年中发生了多少增长?”

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

我当前的查询如下所示:

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循环中调用查询?

最佳答案

是的,有一种方法可以做到。一种方法使用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参考手册特别指出,不能保证用户定义变量的这种行为。

关于mysql - 随时间变化的表格统计信息(也称为行数),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24512416/

10-09 05:30
查看更多