我有一个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获取多个列。
答案 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