解决mysql按照⽇期分组查询中不存在的⽇期需要补充为0的统
计问题
先贴出测试⽤的建表语句
CREATE TABLE `yx_order` (
`id` varchar(36) NOT NULL COMMENT '订单ID',
`money` varchar(36) DEFAULT NULL COMMENT '⾦额',
`memberId` varchar(36) DEFAULT NULL COMMENT '活动会员ID',
`createTime` datetime DEFAULT NULL COMMENT '创建时间',
`updateTime` datetime DEFAULT NULL COMMENT '修改时间',
`state` varchar(255) DEFAULT '0' COMMENT '0 未⽀付 1 已⽀付 2 已领取 3 已过期 ',
`commodityId` varchar(36) DEFAULT NULL COMMENT '商品ID',
mysql交集查询`number` int(11) DEFAULT NULL COMMENT '商品数量',
`addressId` varchar(36) DEFAULT NULL COMMENT '订单id',
`appId` varchar(36) DEFAULT NULL COMMENT 'appId',
PRIMARY KEY (`id`),
KEY `memberIdInd` (`memberId`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='活动订单表';
由于公司的项⽬需要使⽤到echarts数据可视化,需要对订单表进⾏⼀个从2个⽇期之间查出每天的订单量。如果只考虑到字⾯上的理解,
那么select * from yx_order group by createTime 加上between and就可以了。但是,如果连续⼏天都没有订单⽣产,并且正好筛选到
了这⼏天,那么前台页⾯的图形表就死掉了。⼀种解决办法就是在数据库查询的时候把不连续的⽇期查询补充为连续的⽇期查询。
在这⾥顺便复习了mysql的⼏种查询,内连接inner join相当于2个结果集的交集,left join则是左边结果集加上交集,union联合查询则是
进⾏并集查询。我们可以先进⾏⼀个在指定时间范围的数据为0的查询,然后和需要的查询结果集union all起来,就得到了需要的数据。这
⾥需要注意的是,2个结果集的交集,会使⽤第⼀个结果集的交集,顺序不要写错。
SELECT date,sum from (select DATE_FORMAT(createTime,'%Y-%m-%d') date,SUM(money) sum from yx_order where DATE_FORMAT(createTime,'%Y BETWEEN DATE_FORMAT('2018-10-25','%Y-%m-%d') and DATE_FORMAT(DATE_ADD('2018-11-04',INTERVAL 1 day),'%Y-%m-%d')
GROUP BY DATE_FORMAT(createTime,'%Y-%m-%d') UNION all
SELECT
@cdate := DATE_ADD( @cdate, INTERVAL - 1 DAY ) date,
0 AS sum
FROM
( SELECT @cdate := DATE_ADD('2018-11-05', INTERVAL + 1 DAY ) FROM yx_order ) as t1
WHERE
@cdate > '2018-10-25' ) as t2 GROUP BY date asc
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论