因为平常比较少用BETWEEN来查询,现遇到一个问题难解决求解
就是:SELECT * FROM A as a WHERE a.dtime BETWEEN (SELECT `dtime` FROM B ORDER BY `dtime` DESC) AND '2010-10-30 11:21:13' ORDER BY a.`id` DESC现在就是,如果子查询返回结果为空时,则整句都返回空了..
就是:SELECT * FROM A as a WHERE a.dtime BETWEEN (SELECT `dtime` FROM B ORDER BY `dtime` DESC) AND '2010-10-30 11:21:13' ORDER BY a.`id` DESC现在就是,如果子查询返回结果为空时,则整句都返回空了..
建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html
id,topic,dtime '// topic 标题 ,dtime加入记录时间表B
id,dttime '// dttime 新建记录时间表B新建一条语句后,查询表A返回的是最新的表B记录的dttime 往后的记录
where dtime>(select max(dtime) from B)
建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html
1. 你的 create table xxx .. 语句
2. 你的 insert into xxx ... 语句
3. 结果是什么样,(并给以简单的算法描述)
4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)
这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。
他的筛选语句是使用between语句,期中有一个时间是NOW,另一个是从子查询中读取出来的,当子查询的记录为空的时候,他筛选出来的时候就为空,就会出错,就是要判断是否为空的时候, 如果为空,则以另一个时间来取待
`id` int(11) NOT NULL auto_increment,
`topic` varchar(255) NOT NULL,
`dtime` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;
CREATE TABLE `table_b` (
`id` int(11) NOT NULL auto_increment,
`dtime` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
`id` int(11) NOT NULL auto_increment,
`topic` varchar(255) NOT NULL,
`dtime` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;
CREATE TABLE `table_b` (
`id` int(11) NOT NULL auto_increment,
`dtime` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;INSERT INTO `table_a` VALUES ('1', '11101', '2010-10-30 01:23:26');
INSERT INTO `table_a` VALUES ('2', '11102', '2010-10-30 09:11:25');
INSERT INTO `table_a` VALUES ('3', '11103', '2010-10-30 09:24:26');
INSERT INTO `table_a` VALUES ('4', '11104', '2010-10-30 09:33:25');
INSERT INTO `table_a` VALUES ('5', '11105', '2010-10-30 09:34:46');
INSERT INTO `table_a` VALUES ('6', '11106', '2010-10-30 09:51:25');INSERT INTO `table_b` VALUES ('1', '2010-10-30 07:22:16');SELECT * FROM `table_a` as a WHERE a.dtime BETWEEN (SELECT `dtime` FROM `table_b` ORDER BY `dtime` DESC) AND '2010-10-30 11:08:13' ORDER BY a.`id` DE
1:
SELECT `dtime` FROM `table_b` ORDER BY `dtime` DESC
当你的子查询记录条数超过1条的时候,就会出现语义错误。
2:
当子查询得到的是NULL的时候,NULL和任何值比较都得到NULL。可以改为
SELECT * FROM `table_a` as a WHERE a.dtime BETWEEN if(isnull((SELECT `dtime` FROM `table_b` ORDER BY `dtime` DESC limit 1)),'1970-01-01 00:00:00',SELECT `dtime` FROM `table_b` ORDER BY `dtime` DESC limit 1) AND '2010-10-30 11:08:13' ORDER BY a.`id` DESC;