mysql:加入最新产品价格的产品表

时间:2015-02-20 12:01:50

标签: mysql join

我有一个table productPrice,它包含多个产品的多个价格:

productPrice: 
id, 
unixTime, 
productId, 
price

我在过去24小时内查询该产品的最新产品价格和平均价格:

SELECT 
(SELECT AVG(price) FROM productPrice WHERE productId =19 AND unixTime >= (unix_timestamp(NOW())-86400)) as avg, 
price,
unixTime  
FROM productPrice 
WHERE productId =19
ORDER BY unixTime DESC 
LIMIT 1

这会在合理的时间内返回最新价格,unixTime和平均价格(在我看来 - 可能有更好的方法)。 我有另一个表产品,这是我从以下地方获得productId的地方:

products:
id (=productId in productPrice),
name,
url

我想从产品中选择*并使用productId以最新价格和平均价格加入结果,以获得所有产品的结果:

id,name,url,unixTime,price,avg

我在这里读了许多类似的问题,但似乎没有一个对我有用。 有没有一种好的方法可以做到这一点,或者我应该先选择产品,然后为每个产品做一次选择? 提前感谢您的帮助!

编辑:在结果中包含unixTime以从productPrice获取多个列。

2 个答案:

答案 0 :(得分:2)

您可以使用相关子查询完成所需的操作:

select p.*,
       (select avg(price) 
        from productPrice pp
        where pp.productId = p.productid and
              unixTime > (unix_timestamp(NOW()) - 86400)
      ) as avgprice,
       (select price
        from productPrice pp
        where pp.productId = p.productid 
        order by unixTime desc
        limit 1
      ) as mostrecentprice
from products p;

为了提高性能,您需要productPrice(productid, unixtime, price)上的索引。

答案 1 :(得分:1)

我无法在这里测试,但我相信这可能有用:

SELECT p.id, p.name, p.url, pp.price, (SELECT AVG(pr.price) FROM productPrice pr WHERE pr.productId = p.id AND pr.unixTime >= (unix_timestamp(NOW()) - 86400)) avg,
FROM productPrice pp INNER JOIN products p ON pp.productId = p.id
WHERE pp.productId = 19
ORDER BY pp.unixTime DESC