MySQL時間段查詢,無數據補0


上一節提到分時間段統計,可是無數據的時候不顯示,而此時我們需要讓他顯示0。

 

首先我們需要建一個時間表。

CREATE TABLE `my_date` (
  `date` date NOT NULL,
  PRIMARY KEY (`date`)
)

並且插入一些數據,具體怎么插入有好多種方法,目的是生成我們需要的時間格式,如下

 

以下就要用到我們的時間表,與我們的數據表進行連接查詢了。呃,中間的1你們可以忽略啊!!你們需要看的只有 t 和 count

mysql> select DATE_FORMAT(md.date,'%Y-%m') t,1,count(*) from my_date md left join article a on DATE_FORMAT(md.date,'%Y-%m') = DATE_FORMAT(a.article_time,'%Y-%m') group by t;

+---------+---+----------+
| t       | 1 | count(*) |
+---------+---+----------+
| 2015-01 | 1 |        1 |
| 2015-02 | 1 |        1 |
| 2015-03 | 1 |        1 |
| 2015-04 | 1 |        1 |
| 2015-05 | 1 |        1 |
| 2015-06 | 1 |        1 |
| 2015-07 | 1 |        1 |
| 2015-08 | 1 |        1 |
| 2015-09 | 1 |        1 |
| 2015-10 | 1 |        1 |
| 2015-11 | 1 |        1 |
| 2015-12 | 1 |        1 |
| 2016-01 | 1 |        1 |
| 2016-02 | 1 |        1 |
| 2016-03 | 1 |        1 |
| 2016-04 | 1 |        1 |
| 2016-05 | 1 |        1 |
| 2016-06 | 1 |        1 |
| 2016-07 | 1 |        1 |
| 2016-08 | 1 |       22 |
| 2016-09 | 1 |       26 |
| 2016-10 | 1 |        3 |
| 2016-11 | 1 |        1 |
| 2016-12 | 1 |        1 |
+---------+---+----------+
24 rows in set

這里出現了一個問題,無數據的字段變成1了,哈哈哈,什么鬼呀,神經病啊。注意,這里的count(*) 代表統計所有的行,你數據表的那一行無數據,可是我們進行left join 獲得的一行不止數據表吧?還有時間表的,時間表那里不為空,是有數據的,所以變成了1。所以我們要把count(*) 變成 count(a.article_id)

mysql> select DATE_FORMAT(md.date,'%Y-%m') t,1,count(a.article_id) from my_date md left join article a on DATE_FORMAT(md.date,'%Y-%m') = DATE_FORMAT(a.article_time,'%Y-%m') group by t;
+---------+---+---------------------+
| t       | 1 | count(a.article_id) |
+---------+---+---------------------+
| 2015-01 | 1 |                   0 |
| 2015-02 | 1 |                   0 |
| 2015-03 | 1 |                   0 |
| 2015-04 | 1 |                   0 |
| 2015-05 | 1 |                   0 |
| 2015-06 | 1 |                   0 |
| 2015-07 | 1 |                   0 |
| 2015-08 | 1 |                   0 |
| 2015-09 | 1 |                   0 |
| 2015-10 | 1 |                   1 |
| 2015-11 | 1 |                   0 |
| 2015-12 | 1 |                   0 |
| 2016-01 | 1 |                   0 |
| 2016-02 | 1 |                   0 |
| 2016-03 | 1 |                   0 |
| 2016-04 | 1 |                   0 |
| 2016-05 | 1 |                   0 |
| 2016-06 | 1 |                   0 |
| 2016-07 | 1 |                   1 |
| 2016-08 | 1 |                  22 |
| 2016-09 | 1 |                  26 |
| 2016-10 | 1 |                   3 |
| 2016-11 | 1 |                   1 |
| 2016-12 | 1 |                   1 |
+---------+---+---------------------+
24 rows in set

到這里我們發現,時間表里面有多少時間就查出多少,如果我時間表里面有1億個那還了得!所以我們要進行限制,比如要查當前年份的每個月數據。

mysql> select DATE_FORMAT(md.date,'%Y-%m') t,1,count(a.article_id) from my_date md left join article a on DATE_FORMAT(md.date,'%Y-%m') = DATE_FORMAT(a.article_time,'%Y-%m') where DATE_FORMAT(md.date,'%Y') = DATE_FORMAT(curdate(),'%Y') group by t;
+---------+---+---------------------+
| t       | 1 | count(a.article_id) |
+---------+---+---------------------+
| 2016-01 | 1 |                   0 |
| 2016-02 | 1 |                   0 |
| 2016-03 | 1 |                   0 |
| 2016-04 | 1 |                   0 |
| 2016-05 | 1 |                   0 |
| 2016-06 | 1 |                   0 |
| 2016-07 | 1 |                   1 |
| 2016-08 | 1 |                  22 |
| 2016-09 | 1 |                  26 |
| 2016-10 | 1 |                   3 |
| 2016-11 | 1 |                   1 |
| 2016-12 | 1 |                   1 |
+---------+---+---------------------+
12 rows in set

如果我們要指定年份呢

mysql> select DATE_FORMAT(md.date,'%Y-%m') t,1,count(a.article_id) from my_date md left join article a on DATE_FORMAT(md.date,'%Y-%m') = DATE_FORMAT(a.article_time,'%Y-%m') where DATE_FORMAT(md.date,'%Y') = '2015' group by t;
+---------+---+---------------------+
| t       | 1 | count(a.article_id) |
+---------+---+---------------------+
| 2015-01 | 1 |                   0 |
| 2015-02 | 1 |                   0 |
| 2015-03 | 1 |                   0 |
| 2015-04 | 1 |                   0 |
| 2015-05 | 1 |                   0 |
| 2015-06 | 1 |                   0 |
| 2015-07 | 1 |                   0 |
| 2015-08 | 1 |                   0 |
| 2015-09 | 1 |                   0 |
| 2015-10 | 1 |                   1 |
| 2015-11 | 1 |                   0 |
| 2015-12 | 1 |                   0 |
+---------+---+---------------------+
12 rows in set

 

那個時間表里面的數據一定要事先生成咯,生成個幾十年就夠用了,公司說不定活不到那個時候呢哈哈哈,好好笑

下面進行一下每年的統計,到這里我時間表加入了2014年的12個月

mysql> select DATE_FORMAT(md.date,'%Y') t,1,count(a.article_id) from my_date md left join article a on DATE_FORMAT(md.date,'%Y-%m') = DATE_FORMAT(a.article_time,'%Y-%m') group by t;
+------+---+---------------------+
| t    | 1 | count(a.article_id) |
+------+---+---------------------+
| 2014 | 1 |                   0 |
| 2015 | 1 |                   1 |
| 2016 | 1 |                  54 |
+------+---+---------------------+
3 rows in set

這個呢,時間表里面有多少年就顯示多少年,我們也可以指定、

mysql> select DATE_FORMAT(md.date,'%Y') t,1,count(a.article_id) from my_date md left join article a on DATE_FORMAT(md.date,'%Y-%m') = DATE_FORMAT(a.article_time,'%Y-%m') where DATE_FORMAT(md.date,'%Y') > '2014' group by t;
+------+---+---------------------+
| t    | 1 | count(a.article_id) |
+------+---+---------------------+
| 2015 | 1 |                   1 |
| 2016 | 1 |                  54 |
+------+---+---------------------+
2 rows in set
mysql> select DATE_FORMAT(md.date,'%Y') t,1,count(a.article_id) from my_date md left join article a on DATE_FORMAT(md.date,'%Y-%m') = DATE_FORMAT(a.article_time,'%Y-%m') where DATE_FORMAT(md.date,'%Y') > '2014' and DATE_FORMAT(md.date,'%Y') < '2016' group by t;
+------+---+---------------------+
| t    | 1 | count(a.article_id) |
+------+---+---------------------+
| 2015 | 1 |                   1 |
+------+---+---------------------+
1 row in set

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM