从 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 日期获取一个月内的用户数的主要内容,如果未能解决你的问题,请参考以下文章