因为平常比较少用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现在就是,如果子查询返回结果为空时,则整句都返回空了..

解决方案 »

  1.   

    你想实现的功能是什么? (不要高估你的汉语表达能力或者我的汉语理解能力)
       建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
       参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html
       
      

  2.   

    表A
    id,topic,dtime  '// topic 标题 ,dtime加入记录时间表B
    id,dttime       '// dttime 新建记录时间表B新建一条语句后,查询表A返回的是最新的表B记录的dttime 往后的记录
      

  3.   

    估计得这样子,判断(SELECT `dtime` FROM B ORDER BY `dtime` DESC)是否有记录,如果没有,则用一个时间字符替换
      

  4.   

    select * from A
    where dtime>(select max(dtime) from B)
      

  5.   

    4 楼的方法,还是一样,select max(dtime) from B返回空的话,整句返回记录还是Empty Set
      

  6.   

    我测试了不正常啊。按下面方法给出你的测试数据 (不要高估你的汉语表达能力或者我的汉语理解能力)
       建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
       参考一下这个贴子的提问方式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)
       
       这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。   
      

  7.   

    楼主的意思是这样的:
    他的筛选语句是使用between语句,期中有一个时间是NOW,另一个是从子查询中读取出来的,当子查询的记录为空的时候,他筛选出来的时候就为空,就会出错,就是要判断是否为空的时候, 如果为空,则以另一个时间来取待
      

  8.   

    CREATE TABLE `table_a` (
      `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;
      

  9.   

    CREATE TABLE `table_a` (
      `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
      

  10.   

    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;