检索mysql中随时间推移的运行总记录增长

检索mysql中随时间推移的运行总记录增长,mysql,count,cumulative-sum,Mysql,Count,Cumulative Sum,我有一个Drupal站点,它有一个跟踪用户的表。我想做的是绘制会员人数随时间的增长图。所以我想按摩mysql,让它返回如下内容: date | # of users (total who have registered up to the given date) 1/1/2014 | 0 1/2/2014 | 2 1/3/2014 | 10 其中“#of users”是截至给定日期已注册帐户的用户总数(运行总数)——而不是在特定日期注册的用户数(检索起来很简单) 我的{users}表的每一行都

我有一个Drupal站点,它有一个跟踪用户的表。我想做的是绘制会员人数随时间的增长图。所以我想按摩mysql,让它返回如下内容:

date | # of users (total who have registered up to the given date)
1/1/2014 | 0
1/2/2014 | 2
1/3/2014 | 10
其中“#of users”是截至给定日期已注册帐户的用户总数(运行总数)——而不是在特定日期注册的用户数(检索起来很简单)

我的
{users}
表的每一行都有一个
uid
列、一个
name
列和一个
created
(时间戳)列

因此,我的
{users}
表中的示例记录是:

name: John Smith
uid: 526
created: 1365844220

不知道表结构,所以根据需要调整查询

SELECT DATE(created), COUNT(*) AS Users FROM users GROUP BY DATE(created)
当您只想显示注册用户添加的日期时

HAVING COUNT(*) > 0
在查询的和处尝试:

select u.created, count(*)
from (select distinct date(created) created from `users`) u
join `users` u2 on u.created >= date(u2.created)
group by u.created

SQLFiddle。

我最终使用了一个基于堆栈溢出答案的包含变量的解决方案。此解决方案似乎比提供的其他答案更灵活、更高效

  SELECT u.date,
  @running_total := @running_total + u.count AS count
  FROM (
    SELECT COUNT(*) AS count, DATE_FORMAT(FROM_UNIXTIME(created), '%b %d %Y') AS date
    FROM {users}
    WHERE created >= :start_time AND created <= :end_time
    GROUP BY YEAR(FROM_UNIXTIME(created)), MONTH(FROM_UNIXTIME(created)), DAY(FROM_UNIXTIME(created))
  ) u
  JOIN (
    SELECT @running_total := u2.starting_total
    FROM (
      SELECT COUNT(*) as starting_total
      FROM {users}
      WHERE created < :start_time
    ) u2
  ) initialize;

您能给出示例记录吗?查询类似于SUM(#of usscolumn),带有日期before子句sort@JW我用一个样本记录更新了我的原始帖子。基本上,唯一相关的是
created
列。@user466764我想检索一些日期的运行总计数(我可以用图表表示),而不仅仅是某个特定日期注册的用户总数。我希望mysql返回类似这样的内容:
1/1/2014:0 | 1/2/2014:2 | 1/3/2014:10
是否希望每天返回一行,无论是否有用户在当天注册,还是仅在用户注册的当天?如果您想要每天的行,您是否已经设置了一个日期表来保存每天的日期?这将提供在每个日期注册的用户数,但不是在给定日期注册的用户总数。。。(见我原来帖子中粗体的句子)谢谢@Mark!这看起来很有希望。。。不幸的是,
created
是一个unix时间戳,而不是一个日期时间(如果我不清楚的话,很抱歉),但我猜我可以用DATE(created)…@JordanMagnuson:我已经更新了我的查询,用
DATE(created)
截断日期。非常感谢。您的解决方案确实适用于我所述的用例。不幸的是,我在应用程序中遇到了一些问题,无论是在效率方面(在处理成千上万条记录时,查询似乎非常慢),还是在实现项目的特定范围和日期格式需求方面(我在最初的问题中没有发布)。我用我最终使用的代码发布了我自己的答案,但非常感谢你的解决方案。@JordanMagnuson:我在建议我的答案时没有意识到性能会成为一个问题-我曾考虑过一个使用变量的答案,但这更容易编码。@Mark:似乎有一个bug,尽管我无法找出它,请看这个和伯爵这对我来说真是个救命恩人。对于后代:请注意,这种方法也比公认的答案快得多。注意:如果我不提供开始时间(您可以省略结束时间),那么计数对我来说是无效的。
  SELECT u.date,
  @running_total := @running_total + u.count AS count
  FROM (
    SELECT COUNT(*) AS count, DATE(FROM_UNIXTIME(created)) AS date
    FROM {users}
    GROUP BY date
  ) u
  JOIN (
    SELECT @running_total := 0
  ) initialize;