1. 程式人生 > >mysql中group by分組後查詢無資料補0;

mysql中group by分組後查詢無資料補0;

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
結果: