我有以下聯繫表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