今天群里有人了一个问题,大概是要实现如下功能:
实现查询2015年6月1号-5号之内的数据,但是数据库里只有1号和3号两天的数据,2号和4号想查询的时候返回一个主键为-1的空数据,mysql数据库。(意思就是即使这一天没有数据,也要显示出日期,并且主键使用-1代替NULL,并且不能使用其他关联表,如日期表)
通过上网查询并整合,写了如下查询SQL,日期可以根据实际情况进行调整:
-- 定义自增变量 set @i = -1; -- 创建指定日期间记录数天数需要 加 1 set @sql = repeat(" select 1 union all",-datediff('2015-06-01','2015-06-05')+1); -- 将最后一个union all 去掉,这里前边加1个空格,就不用在减1了 set @sql = left(@sql,length(@sql)-length(" union all")); -- 拼接sql,注意日期与第一个SQL中的日期保持一致 set @sql = concat("select date_add('2015-06-01',interval @i:=@i+1 day) as date from (",@sql,") as tmp"); -- 最终要执行的SQL test1是测试表,就是存储数据的表 set @sql1 = concat("select coalesce(test1.id, -1) as id, t.date from test1 RIGHT JOIN (", @sql, " )t on DATE_FORMAT(test1.date,'%Y-%m-%d') = t.date"); prepare stmt from @sql1; execute stmt;
其中,test1表只包括id和date两个字段,id是主键,建表语句如下:
CREATE TABLE test1 ( id int(11) NOT NULL DEFAULT 0 , date varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL , PRIMARY KEY (id) )
测试数据如下:
INSERT INTO `test1` VALUES ('1', '2015-06-01 10:11:22'), ('2', '2015-06-03 10:11:22'), ('3', '2015-06-05 10:11:22'), ('4', '2015-06-06 10:11:22'), ('5', '2015-06-07 10:11:22');
注意:test1中date字段的格式包含具体时间,查询条件不包含时间只包含日期