我有以下联系表mysql如何获取总数的注册用户在每月
id | date_registered
1 2014-08-07
2 2014-08-13
3 2014-08-14
4 2014-10-08
5 2014-10-08
我想运行一个查询它说告诉我是八月登记在几个月内的用户数, 9月和10月。因此,对于上述数据的查询将返回
8 3
9 3
10 5
这是因为3人在八月加入,直到十月有3人注册,然后另有2人加入制作十月有5。
我已经尝试了以下查询以获得答案(该解决方案在Total number of users at end of each week for last 6 months中采用了类似的方法)。
SELECT MONTH(c1.date_registered) AS month,
(SELECT COUNT(c2.id)
FROM contacts AS c2
WHERE c2.date_registered <= (DATE_FORMAT(DATE_ADD(c1.date_registered,
INTERVAL 1 MONTH),'%Y-%m-01')))
AS 'contacts on system'
FROM contacts AS c1
WHERE c1.date_registered BETWEEN '2013-11-01' AND '2014-11-01'
GROUP BY MONTH(c1.date_registered)
该查询返回以下结果
month | contacts on system
8 3
10 5
这是不太我想要的东西,因为九月从结果中丢失。
我现在已经完成了几个人提出的建议,并使用了左连接来获得9月的显示。
这是我的新查询
SELECT MONTH(c1.date_registered) AS month,
(SELECT COUNT(c2.id)
FROM contacts AS c2
WHERE c2.date_registered <= (DATE_FORMAT(DATE_ADD(c1.date_registered,
INTERVAL 1 MONTH),'%Y-%m-01')))
AS ContactsOnSystem
FROM (select 8 as mon union
select 9 as mon union
select 10 as mon
) as m left join
contacts as c1
on MONTH(c1.date_registered) = m.mon
GROUP BY MONTH(c1.date_registered)
当此查询时,它会返回
month | ContactsONSystem
9 0
8 3
10 5
哪个是更好的,但仍然不是我后。我想要说的是,9月份系统中有3个联系人不是0.在8月份注册的3个人仍然在9月注册,因为他们没有去过任何地方。
明白了在第三次尝试工作
SELECT m.mon AS month, (SELECT COUNT(c2.id)
FROM contacts AS c2
WHERE c2.date_registered < m.monthstart) AS ContactsOnSystem
FROM (select '2014-09-01' as monthstart, 8 as mon union
select '2014-10-01' as monthstart, 9 as mon union
select '2014-11-01' as monthstart, 10 as mon
) as m LEFT JOIN
contacts as c1
on MONTH(c1.date_registered) = m.mon
GROUP BY MONTH(c1.date_registered)
好吧,在你的表中9月份没有注册用户,所以你的查询输出是正常的。 – 2014-11-05 11:46:14
您必须加入另一个包含月份的表(或每个月的第一个日期) 以前2014-08-01,2014-09-01,2014-10-01,2014-11-01,2014- 12-01,.... – 2014-11-05 11:49:33