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`

しかし、外側の選択を参照することによって2つのテーブルの副選択を減らすことを望んでいましたが、明らかにそれは好きではありません

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`

3つのテーブルを選択せず​​にクエリを実行する方法はありますか?

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 に答える