3

我有以下查询,它通常有效,并且应该返回涵盖定义时间范围的所有行(如果没有绝对匹配,则取最接近的前一行和下一行 - 在http://www.orafaq.com/node/1834中概述)

SELECT * FROM table
  WHERE id=__ID__ AND `date` BETWEEN 
    IFNULL((SELECT MAX(`date`) FROM table WHERE id=__ID__ AND `date`<=__LOWERLIMIT__), 0)
  AND
    IFNULL((SELECT MIN(`date`) FROM table WHERE id=__ID__ AND `date`>=__UPPERLIMIT__), UNIX_TIMESTAMP())
ORDER BY `date`

但希望通过引用外部选择来减少两个表子选择,但显然它不喜欢它

SELECT * FROM (SELECT * FROM table WHERE id=__ID__) b
  WHERE `date` BETWEEN 
    IFNULL((SELECT MAX(`date`) FROM b WHERE `date`<=__LOWERLIMIT__), 0)
  AND
    IFNULL((SELECT MIN(`date`) FROM b WHERE `date`>=__UPPERLIMIT__), UNIX_TIMESTAMP())
ORDER BY `date`

有没有办法在没有三个表选择的情况下进行查询?

4

1 回答 1

2

你可以通过加入来做这样的事情:

select * from table a
    inner join (
       select id,
              max(
                  if(`date` <= __LOWERLIMIT__ ,`date`, 0)
              ) as min_date,              
              min(
                 if(`date` >= __UPPERLIMIT__ , `date`, UNIX_TIMESTAMP())
              ) as max_date
           from table
           where id = __ID__
           group by id
    ) range on
    range.id = a.id and
    a.`date` between min_date and max_date;

我不是 MySQL 专家,因此如果需要进行一些语法调整,我深表歉意。

更新: OP 也发现了这个非常好的解决方案

于 2012-11-21T09:24:02.537 回答