2013-04-02 129 views
8

我有一個表爲我的用戶有一個名爲「已創建」的字段具有註冊日期。Mysql查詢得到每月計數

如何獲得包含過去12個月每月註冊次數的清單? 像這樣:

Month Count 
1  1232 
2  2222 
3   122 
4  4653 
...  ... 
12  7654 

我不習慣使用MySQL,所以直到現在我才知道怎麼算,去年註冊的數量,而不是如何通過過去12個月算組。提前致謝!

UPDATE

現在我得到這個,使用@fthiella解決方案:

+------------------------------+-------------------------------+----------+ 
| Year(FROM_UNIXTIME(created)) | Month(FROM_UNIXTIME(created)) | Count(*) | 
+------------------------------+-------------------------------+----------+ 
|       2012 |        4 |  9927 | 
|       2012 |        5 |  5595 | 
|       2012 |        6 |  4431 | 
|       2012 |        7 |  3299 | 
|       2012 |        8 |  429 | 
|       2012 |       10 |  3698 | 
|       2012 |       11 |  6208 | 
|       2012 |       12 |  5142 | 
|       2013 |        1 |  1196 | 
|       2013 |        2 |  10 | 
+------------------------------+-------------------------------+----------+ 

如何強制查詢給我數= 0個月?

解決方案通過@fthiella(非常感謝!):

 SELECT y, m, Count(users.created) 
    FROM (
     SELECT y, m 
     FROM 
     (SELECT YEAR(CURDATE()) y UNION ALL SELECT YEAR(CURDATE())-1) years, 
     (SELECT 1 m UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 
      UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 
      UNION ALL SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12) months) ym 
     LEFT JOIN users 
     ON ym.y = YEAR(FROM_UNIXTIME(users.created)) 
      AND ym.m = MONTH(FROM_UNIXTIME(users.created)) 
    WHERE 
     (y=YEAR(CURDATE()) AND m<=MONTH(CURDATE())) 
     OR 
     (y<YEAR(CURDATE()) AND m>MONTH(CURDATE())) 
    GROUP BY y, m; 

而結果:

+------+----+----------------------+ 
| y | m | Count(users.created) | 
+------+----+----------------------+ 
| 2012 | 5 |     5595 | 
| 2012 | 6 |     4431 | 
| 2012 | 7 |     3299 | 
| 2012 | 8 |     429 | 
| 2012 | 9 |     0 | 
| 2012 | 10 |     3698 | 
| 2012 | 11 |     6208 | 
| 2012 | 12 |     5142 | 
| 2013 | 1 |     1196 | 
| 2013 | 2 |     10 | 
| 2013 | 3 |     0 | 
| 2013 | 4 |     0 | 
+------+----+----------------------+ 

回答

9

如果創建是一個INT場,你應該使用FROM_UNIXTIME功能,將其轉換爲一個日期字段,然後MONTH函數提取月份:

SELECT Month(FROM_UNIXTIME(created)), Count(*) 
FROM yourtable 
WHERE FROM_UNIXTIME(created) >= CURDATE() - INTERVAL 1 YEAR 
GROUP BY Month(FROM_UNIXTIME(created)) 

這將計算在過去12個月內創建的所有行。請注意,它在今年可能會更好也組:

SELECT Year(FROM_UNIXTIME(created)), Month(FROM_UNIXTIME(created)), Count(*) 
FROM yourtable 
WHERE FROM_UNIXTIME(created) >= CURDATE() - INTERVAL 1 YEAR 
GROUP BY Year(FROM_UNIXTIME(created)), Month(FROM_UNIXTIME(created)) 

如果你需要計算的,而不是行的註冊號碼,你可以使用類似

COUNT(registration_number) 

跳過空值,或

COUNT(DISTINCT registration_number) 

只計算不同的數。

編輯

如果你還需要證明具有計數= 0,我會用這樣的查詢返回所有月份的當前和上年度月:

SELECT y, m 
FROM 
    (SELECT YEAR(CURDATE()) y UNION ALL SELECT YEAR(CURDATE())-1) years, 
    (SELECT 1 m UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 
    UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 
    UNION ALL SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12) months; 

然後我會使用一個LEFT JOIN,返回所有第一次查詢的行,只有第二個查詢的行匹配:

SELECT y, m, Count(yourtable.created) 
FROM (
    SELECT y, m 
    FROM 
    (SELECT YEAR(CURDATE()) y UNION ALL SELECT YEAR(CURDATE())-1) years, 
    (SELECT 1 m UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 
     UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 
     UNION ALL SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12) months) ym 
    LEFT JOIN yourtable 
    ON ym.y = YEAR(FROM_UNIXTIME(yourtable.created)) 
    AND ym.m = MONTH(FROM_UNIXTIME(yourtable.created)) 
WHERE 
    (y=YEAR(CURDATE()) AND m<=MONTH(CURDATE())) 
    OR 
    (y<YEAR(CURDATE()) AND m>MONTH(CURDATE())) 
GROUP BY y, m 

(請注意,這裏我只考慮過去12個月,所以如果我們在2013年4月中旬,它將在2012年5月至4月13日的間隔內計算行數,如果這不是正確的行爲,請讓我知道)

+0

我創建的字段是一個int字段,因爲我的註冊日期是時間戳格式... –

+0

'MONTH(FROM_UNIXTIME(your_field))'應該可以工作 – Vatev

+0

@DavidR我更新了我的答案,不應該是正確的 – fthiella

9
SELECT MONTH(reg_date) , COUNT(reg_date) 
FROM your_table 
WHERE reg_date >= NOW() - INTERVAL 1 YEAR 
GROUP BY MONTH(reg_date) 
+0

它顯示的是在數據庫中有記錄的MOnths。我如何整個月都這樣做。意味着1-12個月。 ?? – Sankalp

+0

檢查另一個答案:) – Vatev

0

如果這可以幫助別人,我還希望這個查詢,但因爲這是不一定是一個給定的時間間隔在過去的12個月(也與日期時間戳):

set @start='2013-05-01 00:00:00'; 
set @end='2015-03-31 00:00:00'; 

SELECT YEAR(FROM_UNIXTIME(yourtable.created_date)), MONTH(FROM_UNIXTIME(yourtable.created_date)), COUNT(yourtable.created_date) 
FROM yourtable 
WHERE created_date BETWEEN UNIX_TIMESTAMP(DATE(@start)) AND UNIX_TIMESTAMP(DATE(@end)) 
GROUP BY YEAR(FROM_UNIXTIME(yourtable.created_date)), MONTH(FROM_UNIXTIME(yourtable.created_date)) 
ORDER BY YEAR(FROM_UNIXTIME(yourtable.created_date)), MONTH(FROM_UNIXTIME(yourtable.created_date));