【问题标题】:MySQL Get Min, Max and oldest grouped byMySQL获取Min,Max和最旧的分组方式
【发布时间】:2016-11-21 21:07:30
【问题描述】:

我正在处理一个小项目,并进行了以下设置:

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  |
+----+-------+-------+-------------+----------+

其中 low、high 和 original 分别是商品的最低、最高和原始价格。一个好处是能够知道它什么时候最高和最低。我一直在使用 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;

反正我能做到吗?

谢谢!

【问题讨论】:

  • 您的价格数据类型是 DECIMAL,对吧?
  • 不,不是。我把它写成 varchar
  • 好的。也许可以解决这个问题!

标签: php mysql


【解决方案1】:

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

 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`

第二个应该是正确的,因为明确选择行并获得非聚合值的第一个结果

【讨论】:

  • 我不需要身份证。这个得到一个关于Error in query (1248): Every derived table must have its own alias的错误
  • @wiZZmnma 答案已更新 .. 缺少来自 ( ) 的 t1
  • 黄金!非常感谢!接受
猜你喜欢
  • 2021-01-15
  • 2017-06-10
  • 1970-01-01
  • 2019-06-25
  • 1970-01-01
  • 2016-08-27
  • 1970-01-01
  • 2015-04-14
  • 2014-03-11
相关资源
最近更新 更多