我们平时开发中偶尔会遇到统计,但是有时候根据时间统计的时候,有些时间内数据为空,这时候我们前端的开发人员不知道具体是那一天(或者别的时间点),这个时候我们需要一张时间的辅助表 ,通过和时间辅助表联查获得那一天数据为空的时间
1:建表
DROP TABLE IF EXISTS `t_calendar_auxiliary`;
CREATE TABLE `t_calendar_auxiliary` (
`i` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='日历辅助表';
2:往表里面添加数据
-- Records of t_calendar_auxiliary
INSERT INTO `t_calendar_auxiliary` VALUES ('0');
INSERT INTO `t_calendar_auxiliary` VALUES ('1');
INSERT INTO `t_calendar_auxiliary` VALUES ('2');
INSERT INTO `t_calendar_auxiliary` VALUES ('3');
INSERT INTO `t_calendar_auxiliary` VALUES ('4');
INSERT INTO `t_calendar_auxiliary` VALUES ('5');
INSERT INTO `t_calendar_auxiliary` VALUES ('6');
INSERT INTO `t_calendar_auxiliary` VALUES ('7');
INSERT INTO `t_calendar_auxiliary` VALUES ('8');
INSERT INTO `t_calendar_auxiliary` VALUES ('9');
3:通过CROSS JOIN(笛卡尔乘积) 将两个表乘起来
SELECT
adddate( '2018-09-01', numlist.id ) AS date_day
FROM
(
SELECT
n1.i + n10.i * 10 + n100.i * 100 AS id
FROM
t_calendar_auxiliary n1
CROSS JOIN t_calendar_auxiliary AS n10
CROSS JOIN t_calendar_auxiliary AS n100
) AS numlist
WHERE
adddate( '2018-09-01', numlist.id ) <= '2018-09-07'
4:返回结果:
5,通过开始时间和结束时间往时间辅助表里面添加数据
6:MySQL的多表查询(笛卡尔积原理)
- 先确定数据要用到哪些表。
- 将多个表先通过笛卡尔积变成一个表。
- 然后去除不符合逻辑的数据(根据两个表的关系去掉)。
- 最后当做是一个虚拟表一样来加上条件即可。