mysql特殊查询

今天群里有人了一个问题,大概是要实现如下功能:

实现查询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字段的格式包含具体时间,查询条件不包含时间只包含日期

猜你喜欢

转载自heweina2007.iteye.com/blog/2220138