我应该使用子查询吗?

时间:2010-08-30 17:06:01

标签: sql mysql

我有两个表,一个存储当前价格,另一个存储物品的历史价格。我想创建一个查询来提取当前价格,以及当前价格和最近历史价格之间的差异。

在历史表中,我有价格的开始和结束时间,所以我可以选择最近的价格,但如何在一个查询中将它们全部拉到一起?或者我必须做一个子查询?

select p.current_price,
h.historical_price
h.historical_time  

from price p

inner join price_history h
on p.id = h.id
where max(h.historical_time)

这显然不起作用,但这正是我想要完成的。

这给了我当前和历史价格。但我想确保我有最近的价格。我该怎么做?

3 个答案:

答案 0 :(得分:2)

我会这样做。请注意,如果id中有两个具有相同price_history日期的价格条目,则您可能会获得重复记录:

select p.current_price, h.historical_price,
    p.current_price - h.historical_price as PriceDeff, h.historical_time 
from price p
inner join (
    select id, max(historical_time) as MaxHistoricalTime
    from price_history
    group by id
) hm on p.id = hm.id
inner join price_history h on hm.id = h.id 
    and hm.MaxHistoricalTime = h.historical_time

答案 1 :(得分:1)

我不相信没有一个没有更糟糕的子查询的方法。另一方面,如果表的索引正确,则返回聚合函数结果的子查询通常非常快。

答案 2 :(得分:0)

select
      p.current_price,
      h3.historical_price,
      h3.historical_time
  from 
      price p,
      ( select h1.id, max( h1.historical_time ) as MaxHT
            from price_history h1
            group by 1 ) h2,
      price_history h3
  where 
          p.id = h2.id
      and p.id = h3.id
      and h2.MaxHT = h3.historical_time