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






评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值