MySql根据第一个和最后一个关系之间的差异检索行

时间:2014-10-27 09:31:32

标签: mysql join subquery relational-database

我有两张表itemprice。随着时间的推移,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表两次,例如,使用startPriceendPrice作为别名,然后将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

2 个答案:

答案 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

http://sqlfiddle.com/#!2/a8caf/15