【问题标题】:Get the count of users in a month from MySQL date从 MySQL 日期获取一个月内的用户数
【发布时间】: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 次。 我想要的是从一个查询中获取每个月的用户数量。如果我将日期存储为三列,如日期、月份、年份,我可以得到这个结果。但我不想改变当前的表结构。有没有办法在不改变当前表结构的情况下完成这项任务?

【问题讨论】:

    标签: mysql sql spring-boot


    【解决方案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,是的,我同意,如果选择不在一年之内,则应按年-月分组
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-11
    • 1970-01-01
    相关资源
    最近更新 更多