mysql中group by分組後查詢無資料補0;
阿新 • • 發佈:2019-01-24
mysql經常會用到Group By來進行分組查詢,但也經常會遇到一個問題,就是當有where條件時,被where條件過濾的資料不顯示了。
例如我有一組資料:
我想查詢當日領取數量和當日核銷數量;
正常的sql查出的話,假如不存在相關記錄
SELECT
cardId ,
count( *) count
FROM
userwechatcard
WHERE
DATE( FROM_UNIXTIME( consumeTime / 1000 ,
'%Y%m%d' )) = CURDATE()
AND cardState = 6300
GROUP BY
cardId
結果查不到任何記錄;
因此,我們想實現,即使沒有資料,也想讓count顯示出0而不是空的效果;
解決方案:構建一個包含所有cardId的結果集;然後和我們本來的sql進行左外連線,在最外層利用ifnull函式
sql如下:
SELECT DISTINCT uw.cardId uwci, IFNULL( tb.count, 0) usedCount FROM userwechatcard uw LEFT JOIN ( SELECT cardId , count( *) count FROM userwechatcard WHERE DATE( FROM_UNIXTIME( consumeTime / 1000, '%Y%m%d')) = CURDATE() AND cardState = 6300 GROUP BY cardId ) AS tb ON uw.cardId = tb.cardId
另外一個:
加強版:
我想講上述兩個結果集合並起來,他們的cardId是相同的,上述圖片我忘記加別名了;
解決方案:將兩個結果集作為查詢來源,並分別起別名使用左外聯
sql:
結果:select uwc cardId,a.receivedCount,b.usedCount from ( SELECT DISTINCT uw.cardId uwc, IFNULL( tb.count ,0 ) receivedCount FROM userwechatcard uw LEFT JOIN ( SELECT cardId , count( * ) count FROM userwechatcard WHERE DATE( FROM_UNIXTIME( getTime / 1000 ,'%Y%m%d' )) = CURDATE() GROUP BY cardId ) AS tb ON uw.cardId = tb.cardId ) a LEFT JOIN ( SELECT DISTINCT uw.cardId uwci, IFNULL( tb.count, 0) usedCount FROM userwechatcard uw LEFT JOIN ( SELECT cardId , count( *) count FROM userwechatcard WHERE DATE( FROM_UNIXTIME( consumeTime / 1000, '%Y%m%d')) = CURDATE() AND cardState = 6300 GROUP BY cardId ) AS tb ON uw.cardId = tb.cardId ) b ON a.uwc = b.uwci