我有以下查询,它通常有效,并且应该返回覆盖定义时间范围的所有行(如果没有绝对匹配则采用最接近的前一行和下一行 - 在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`
有没有办法让查询没有三个表选择?
答案 0 :(得分: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还找到this very nice solution。