从 MySQL 日期获取一个月内的用户数

Posted

技术标签:

【中文标题】从 MySQL 日期获取一个月内的用户数【英文标题】:Get the count of users in a month from MySQL date 【发布时间】:2020-02-25 07:29:09 【问题描述】:

我想在我的网络应用程序上显示每个月的注册用户。为此,我想从用户表中查询计数并将其发送到前端。例如,我从以下查询中获取一个月内的用户数。

select count(u_id) AS 'Count', MONTH(reg_date) AS Month
from user
WHERE(reg_date) BETWEEN '2019-10-01' AND '2019-10-31'

这显示 10 月份注册的用户数。我从这个查询中得到的结果表是这样的。

------------------------
Count            Month
------------------------
2                10
------------------------

我想要得到的结果如下。

------------------------
Count            Month
------------------------
2                1
------------------------
10               2
------------------------
5               3
------------------------

我已将用户 ID 和注册日期存储在用户表中。注册日期是 SQL 日期类型,用户 ID 是整数。我可以使用下面提到的查询获取给定月份的用户数量,并将其存储在后端的变量中,然后再次调用数据库以获取下个月,依此类推(使用循环)。然后创建一个列表并发送到前端。但是为此我必须多次调用数据库。为了获得 12 个月的用户,我必须查询 12 次。 我想要的是从一个查询中获取每个月的用户数量。如果我将日期存储为三列,如日期、月份、年份,我可以得到这个结果。但我不想改变当前的表结构。有没有办法在不改变当前表结构的情况下完成这项任务?

【问题讨论】:

【参考方案1】:

您正在寻找的是 GROUP BY。

SELECT count(u_id) AS 'Count', MONTH(reg_date) AS Month
from user
WHERE(reg_date) BETWEEN '2019-01-01' AND '2019-12-31'
GROUP BY YEAR(reg_date), MONTH(reg_date);

【讨论】:

如果 OP 恰好完全错过一个或多个月会怎样? @timbiegeleisen 这将是一个显示问题,在应用程序代码中最优雅地解决了【参考方案2】:

首先是生成months 1 to 12,然后是join基于month的原始查询。

select t1.monthNo,  t2.Count
from (select 1 as monthNo
    union
    select 2 as monthNo
    union
    select 3 as monthNo
    union
    select 4 as monthNo
    union
    select 5 as monthNo
    union
    select 6 as monthNo
    union
    select 7 as monthNo
    union
    select 8 as monthNo
    union
    select 9 as monthNo
    union
    select 10 as monthNo
    union
    select 11 as monthNo
    union
    select 12 as monthNo) as t1
left join 
    (select count(u_id) AS 'Count', month(reg_date) AS Month
    from user   
    group by month(reg_date)) t2 on t2.Month = t1.monthNo

【讨论】:

@Metal 我必须创建一个包含 12 个月的新表,对吗? 不需要,只需将整个 t1(子查询)复制为您的月份 @Pegasus008,这个 dbfiddle 可能会有所帮助。 db-fiddle.com/#&togetherjs=82qGuyLQn4 我认为应该添加WHERE YEAR(reg_date)=**year** 以防止重叠年份 @tcadidot0,是的,我同意,如果选择不在一年之内,则应按年-月分组

以上是关于从 MySQL 日期获取一个月内的用户数的主要内容,如果未能解决你的问题,请参考以下文章

mysql中怎么查询一周内,三个月内,半年内的数据?

合并两个日期字段在两个月内的 pandas DataFrame

sql查询当前月内的所有日期

计算6个月内的所有日期,而不是整体

获取从日期到月底 PHP 的秒数

SQL:一个月内的子间隔