2016-11-21 67 views
1

我有一个小项目,我的工作,并具有以下设置分组:MySQL的获取最小,最大和最古老的

MariaDB [b7_19195200_prices]> select * from watchlist; 
+----+-------------+-------+---------------------+--------+ 
| id | item  | price | recorded   | errors | 
+----+-------------+-------+---------------------+--------+ 
| 3 | 32725999014 | 1.46 | 2016-11-21 20:30:22 |  0 | 
| 4 | 32725999014 | 1.93 | 2016-11-21 20:56:21 |  0 | 
| 5 | 32725999014 | 2.01 | 2016-11-21 20:56:32 |  0 | 
| 6 |  122444 | 22.43 | 2016-11-21 21:03:19 |  0 | 
| 7 | 32725999014 | 1.11 | 2016-11-21 21:25:33 |  0 | 
+----+-------------+-------+---------------------+--------+ 
5 rows in set (0.00 sec) 

所以我想获得价格的最大的,最小价格和第一个(该项目的价格最早记录)。所以我会得到如下结果:

+----+-------+-------+-------------+----------+ 
| id | low | high | item  | original | 
+----+-------+-------+-------------+----------+ 
| 6 | 22.43 | 22.43 |  122444 | 12.11 | 
| 3 | 1.11 | 2.01 | 32725999014 | 0.51 | 
+----+-------+-------+-------------+----------+ 

其中低,高和原始分别是该物品的最低,最高和原始价格。奖金将能够知道什么时候最高和最低。我一直在使用获得最高,最低及原价格为2个不同的查询:

SELECT `id`, MIN(`price`) low, MAX(`price`) high, `item` 
FROM `watchlist` 
GROUP BY `item`; 

SELECT `id`, MIN(`recorded`), `price` original, `item` 
FROM `watchlist` 
GROUP BY item; 

反正我能做到吗?

谢谢!

+0

您的价格数据类型是DECIMAL,对不对? – Strawberry

+0

不,它不是。我把它作为varchar – wiZZmnma

+0

好的。也许解决它! – Strawberry

回答

1

,如果你不需要,你可以使用id联接

select t1.*, t2.* 
from ( 
    SELECT MIN(`price`) low, MAX(`price`) high, `item` 
    FROM `watchlist` 
    GROUP BY `item` 
) t1 
left join (
    SELECT MIN(`recorded`), `price` original, `item` 
    FROM `watchlist` 
    GROUP BY item 
) t2 on t1.`item` = t2.`item` 

否则,如果您还需要在ID加入和元组的子查询

select t1.*, t2.* 
from ( 
    SELECT MIN(`price`) low, MAX(`price`) high, `item` 
    FROM `watchlist` 
    GROUP BY `item` 
) t1 
left join (
    select `id`, `recorded`, `price`, `item` 
    from `watchlist` 
    where ( `item`, `recorded`) in (
     select `item`, min(`recorded`) 
     FROM `watchlist` 
     GROUP BY item 
) 
) t2 on t1.`item` = t2.`item` 

第二应该是becase的选择正确行解释并获得非聚合值的第一个结果

+0

我不需要id。这个人得到一个关于错误查询(1248)的错误:每个派生表都必须有自己的别名' – wiZZmnma

+0

@wiZZmnma答案更新..从...丢失t1() – scaisEdge

+0

黄金!非常感谢!公认 – wiZZmnma