我准备了一个关于我们其中一个应用程序的演示文稿并且问自己以下问题:"根据我们数据库中存储的数据,过去几年发生了多少增长?" #34;
所以我想基本上在一个输出/图表中显示自项目开始以来我们存储了多少数据。
我当前的查询如下所示:
SELECT DATE_FORMAT(created,'%y-%m') AS label, COUNT(id) FROM table GROUP BY label ORDER BY label;
示例输出将是:
不幸的是,这个查询缺少了积累。我希望收到以下结果:
有没有办法在mysql中解决这个问题,而不需要在php循环中调用查询?
答案 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参考手册明确指出不保证用户定义变量的这种行为。