我正在准备一个有关我们的应用程序的演示文稿,并问自己以下问题:“基于存储在我们数据库中的数据,过去几年中发生了多少增长?”
所以我想基本上在一个输出/图中显示自项目开始以来我们存储的数据量。
我当前的查询如下所示: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/