【问题标题】:total user count monthwise每月用户总数
【发布时间】:2012-04-04 17:05:58
【问题描述】:

mySQL 总用户数

按月分组

我想列出按月分组的注册用户总数

嗯,这个问题的困难在于我不想要 per 月的计数, 但截至(包括)当月的用户总数

用户表结构

+---------------+--------------+------+-------------------+----------------+
| Field         | Type         | Null | Default           | Extra          |
+---------------+--------------+------+-------------------+----------------+
| ID            | int(11)      | NO   | NULL              | auto_increment |
| email         | varchar(225) | NO   | NULL              |                |
................................-CUT-.......................................
| registered    | timestamp    | NO   | CURRENT_TIMESTAMP |                |
+---------------+--------------+------+-------------------+----------------+

示例数据

1 example1@mail 2012-04-04 xx:xx:xx
2 example2@mail 2012-05-04 xx:xx:xx
3 example3@mail 2012-05-04 xx:xx:xx

首选输出

+------+-------+-------+
| Year | Month | Count |
+------+-------+-------+
| 2012 | 01    | 0     |
| 2012 | 02    | 0     |
| 2012 | 03    | 0     |
| 2012 | 04    | 1     |
| 2012 | 05    | 3     |
+------+-------+-------+

NULL 结果不是必需的。

如何在纯 mySQL 中实现该结果?

【问题讨论】:

  • 我用 COUNT(*) 和 GROUP BY YEAR(registered), MONTH(registered) 尝试了几个查询。我也做了一个 join 实验,但我还没有达到 mySQL 的高级水平。

标签: mysql count


【解决方案1】:

我还没有尝试过,但是这些方面的东西应该可以工作 -

SELECT tots.*, @var := @var + tots.`count`
FROM (
    SELECT
        YEAR(registered) AS `year`,
        MONTH(registered) AS `month`,
        COUNT(*) AS `count`
    FROM user
    GROUP BY `year`, `month`
) AS tots, (SELECT @var := 0) AS inc

【讨论】:

  • 在这里,我们通过接受答案和点赞表示感谢。只需单击您要接受的答案旁边的勾号即可。
  • 当然,我只是想评论一下别人的答案。我还不能投票,因为我的代表太低了。
  • 对不起,不是故意给你压力的。很多时候,这里的新用户在下一个问题出现之前就消失了。
【解决方案2】:

您可以使用几个用户变量来做到这一点:

set @c = 0;
set @d = 0;
select y, m, @d := @d + Count as Count from
  (select year(registered) as y, 
     month(registered) as m, 
     @c := @c + count(*) as Count
   from user
   group by y,m) as t;

给你

+------+------+-------+
| y    | m    | Count |
+------+------+-------+
| 2011 |    1 |  2455 | 
| 2011 |    2 | 14253 | 
| 2011 |    3 | 42311 | 

【讨论】:

  • 您的版本也可以,谢谢。请在第一个 at-d 之后删除第 3 行的“=”标记,这会导致语法错误。
  • “@d := @d + Count...”的语法是正确的 - 当您处于选择状态时,这就是您将值分配给用户变量的方式。语法错误到底是什么?它一定来自其他东西。
【解决方案3】:

此方法首先获取发生任何注册的所有月份的第一天。然后它加入到每个注册时间大于当月第一天的用户,然后计算用户数。

SELECT
    YEAR(dates.first_day_of_month) AS registration_year,
    MONTH(dates.first_day_of_month) AS registration_month,
    COUNT(u.ID)
FROM (
    SELECT DISTINCT
        DATE_SUB(
            DATE_ADD(
                DATE_SUB(registered,INTERVAL (DAY(registered)-1) DAY), 
            INTERVAL 1 MONTH), 
        INTERVAL 1 SECOND) first_day_of_month
    FROM user 
) dates 
    LEFT JOIN user u ON u.registered <= dates.first_day_of_month
GROUP BY dates.first_day_of_month

如果您想避免在没有发生注册的月份之间出现间隔,您可以将子查询替换为另一个使用预先存在的“数字”表来获取所有可能月份的列表。

【讨论】:

  • 感谢您的帮助。我将使用@nnichols 方法,他是第一个。但是,请注意您的代码包含一个小错误,总数是“倒置”计算的(2011 - 共 2 个,2012 - 共 1 个)
  • @noneevr2 你是对的,谢谢...&gt;= 应该是 &lt;=
  • 我认为您需要更改计算以获取该月的最后一秒。
  • @nnichols 你是对的......男孩,解决这个问题让我的查询变得更加丑陋...... +1 以获得更清晰的答案。
  • 不是更好,但你可以使用 - LAST_DAY(registered) + INTERVAL 1 DAY - INTERVAL 1 SECOND
猜你喜欢
  • 2016-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-08
  • 2021-02-23
  • 2023-03-17
  • 1970-01-01
  • 2013-05-24
相关资源
最近更新 更多