2013-04-02 124 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));