mysql按日期分組統計數據


最近在做一個招聘網時,需要顯示一個月內企業招聘信息的發布數量,按日期分組統計,剛開始是直接從源數據庫表里面進行group by,但這樣子就出現日期不連續的問題了,我想要的效果是,若當天沒有數據,則顯示為0,這樣就達到連續的效果。一開始的想法是使用外連接的方法,但這樣就需要另外一張日期表作為連接的對象,研究半天,也就這辦法來的實在點,如下:

 

 

 

這里我生成從2016-1-1開始的10w條日期數據,對於連接已經夠用了,下面顯示的是第9w9到10w的的數據

接着,就可以用left join做連接來做日期分組排序了。

SELECT DATE(dday) createDate,COUNT(*)-1 AS createDateNum FROM(SELECT datelist AS dday FROM calendar-- 這里是限制返回最近30天的數據            
    WHERE DATE_SUB(CURDATE(),INTERVAL 30 DAY) <= DATE(datelist)&&DATE(datelist)<=CURDATE()         
    UNION ALL SELECT DATE_FORMAT(t_recruitinfo.createDate,'%Y-%m-%d') FROM t_recruitinfo) a GROUP BY createDate;

 ***********************************************

語法惡補:

SQL中的連接可以分為內連接,外連接,以及交叉連接 。

1. 交叉連接CROSS JOIN

如果不帶WHERE條件子句,它將會返回被連接的兩個表的笛卡爾積,返回結果的行數等於兩個表行數的乘積。

cross join后加條件只能用where,不能用on。

如果兩個需要求交際的表太大,將會非常非常慢,不建議使用。

2. 內連接INNER JOIN-兩邊表同時符合條件的組合

如果僅僅使用

SELECT * FROM table1 INNER JOIN table2

內連接如果沒有指定連接條件的話,和笛卡爾積的交叉連接結果一樣,但是不同於笛卡爾積的地方是,沒有笛卡爾積那么復雜要先生成行數乘積的數據表,內連接的效率要高於笛卡爾積的交叉連接。

但是通常情況下,使用INNER JOIN需要指定連接條件。

 

等值連接(=號應用於連接條件, 不會去除重復的列)

自然連接(會去除重復的列)

數據庫的連接運算都是自然連接,因為不允許有重復的行(元組)存在。

例如:

SELECT * FROM table1 AS a INNER JOIN table2 AS b on a.column=b.column

3. 外連接OUTER JOIN-指定條件的內連接,僅僅返回符合連接條件的條目。

外連接則不同,返回的結果不僅包含符合連接條件的行,而且包括左表(左外連接時), 右表(右連接時)或者兩邊連接(全外連接時)的所有數據行。

1)左外連接LEFT [OUTER] JOIN

顯示符合條件的數據行,同時顯示左邊數據表不符合條件的數據行,右邊沒有對應的條目顯示NULL

2)右外連接RIGHT [OUTER] JOIN

顯示符合條件的數據行,同時顯示右邊數據表不符合條件的數據行,左邊沒有對應的條目顯示NULL

3)全外連接full [outer] join

顯示符合條件的數據行,同時顯示左右不符合條件的數據行,相應的左右兩邊顯示NULL,即顯示左連接、右連接和內連接的並集

 


免責聲明!

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



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