我有两张表item
和price
。随着时间的推移,item
表中添加了多个price
个记录。这些price
条记录的price
字段在给定时间内存储item
价格,例如:
Price table
id_item timestamp price
1 2014-27-10 00:00:00 10
1 2014-27-10 01:00:00 20
2 2014-27-10 00:00:00 10
2 2014-27-10 01:00:00 30
etc...
我需要做的是根据item
增加选择前5个price
,我不确定这是否可以通过加入price
表两次,例如,使用startPrice
和endPrice
作为别名,然后将where
子句添加到两个价格之间的差异,例如像这样的东西(不起作用):
SELECT `i`.*,
`pStart`.`price` `startPrice`,
`pEnd`.`price` `endPrice`,
SUM(`startPrice` - `endPrice`) as `diffPrice`
FROM `item` `i`
INNER JOIN `price` `pStart`
ON `pStart`.`id_item` = `i`.`id`
INNER JOIN `price` `pEnd`
ON `pEnd`.`id_item` = `i`.`id`
AND `pEnd`.`timestamp` = (
SELECT MAX(`timestamp`)
FROM `price`
WHERE `id_item` = `i`.`id`)
GROUP BY `i`.`name`
如果没有SUM(startPrice - endPrice) as diffPrice
行,它会正确返回startPrice和endPrice,但我无法确定如何按两个价格之间的“增加”价格进行排序,然后将结果限制为5个结果?
我不确定我是否应该沿着这条路线或主要选择中的一系列子查询?虽然我可以缓存查询结果以减轻负载,但我知道子查询可能非常慢。
[编辑]
感谢Strawberry的评论,我在这里添加了一个sql小提琴:
http://sqlfiddle.com/#!2/a8caf/3
我想在这个例子中实现的输出是:
Item.name Price difference
Item7 70
Item6 60
Item5 50
Item4 40
Item3 30
答案 0 :(得分:1)
对于此查询,您并不需要在外层进行聚合。相反,找到最小和最大时间戳,然后根据以下内容加入价格信息:
SELECT i.start, ps.price as startPrice, pe.price as endPrice,
(pe.price - ps.price) as diffPrice
FROM item i INNER JOIN
(SELECT p.id_item, MIN(p.timestamp) as mints, MAX(p.timestamp) as maxts
FROM price
GROUP BY p.id_item
) pp JOIN
price ps
ON ps.id_item = i.id AND ps.timestamp = pp.mints JOIN
price pe
ON pe.id_item = i.id AND pe.timestamp = pp.maxts
ORDER BY diffPrice DESC
LIMIT 5;
答案 1 :(得分:0)
这个解决方案相当依赖于每个项目只有两个值......
SELECT i.name
, x.price-y.price diff
FROM item i
JOIN price x
ON x.id_item = i.id
JOIN price y
ON y.id_item = x.id_item
AND y.id < x.id
ORDER
BY diff DESC
LIMIT 5