在子查询中引用外部查询

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`

有没有一种方法可以在不使用三个表选择的情况下进行查询?
1个回答

2
您可以使用联接(join)来实现类似以下的操作:
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专家,如果需要一些语法调整,请见谅。

更新: 问题提出者还找到了这个非常好的解决方案


你认为由于外部查询的原因,它会被调用1000次吗?难道在这里不会做同样的事情吗(第二个select是连接的子查询)?而且“RANGE ON”似乎并不是MySQL特有的,它的目的是什么呢? - user1841321
еӯҗжҹҘиҜўдёӯд»…MINе’ҢMAXзҡ„жғ…еҶөдјҡеј•еҸ‘иҜӯжі•й”ҷиҜҜгҖӮиҝҷйҮҢзҡ„вҖңcaseвҖқжҢҮзҡ„жҳҜд»Җд№Ҳпјҹ - user1841321
尽管CASE也应该起作用,但IF似乎可以正常工作,我使用的是5.5版本。不过我想知道ifs正在查询哪些“日期”值。 - user1841321
有时候,最明显的答案有点隐藏 :) http://stackoverflow.com/a/5914974/1841321 即使它是三个联合选择,我仍然认为这是最便宜的方法。 - user1841321
@user1841321,我同意,那是一个很好的答案。 - dan1111
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接