mysql - 使用max()获取正确的列值

时间:2017-07-29 09:21:57

标签: mysql max

我有两个表,itemprices

prices表保存item表中每个项目的价格。价格表中有一个名为counter的额外字段 - 以周期性方式存储并递增1。因此,对于每个计数器,价格表中将有一组 N 行,其中N是项目表中的项目数。

CREATE TABLE `item` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`)
) 

CREATE TABLE `prices` (
  `id` bigint(9) NOT NULL AUTO_INCREMENT, 
  `price` float(10,2) NOT NULL,  
  `ts` datetime NOT NULL,
  `counter` int(10) unsigned DEFAULT NULL,
  `item_id` int(10) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `ts` (`ts`),
  KEY `counter` (`item_id`,`counter`) USING BTREE
) ENGINE=InnoDB

现在,我需要找出每个项目对应的价格的最大值 - 在任何特定日期 - 以及计数器值。

对于任何项目,可能存在多个具有相同价格的行 - 需要选择第一个匹配项。

我尝试了以下查询。

SELECT p.id, p.counter, max.price
FROM prices AS p
JOIN (

SELECT item_id, MAX( price ) as price
FROM prices
WHERE ts
BETWEEN  '2017-07-28 00:00:00'
AND  '2017-07-28 23:59:59'
GROUP BY item_id
)
max 

ON max.item_id = p.item_id
and p.price= max.price

这并没有给出所需的结果。

如何更正我的查询?

感谢。

编辑 - 样本数据

select id, item_id, price,counter from prices order by item_id, price;
+-------+---------+-------+---------+
| id    | item_id | price | counter |
+-------+---------+-------+---------+
| 30192 |      54 | 18.95 |     200 |
| 15061 |      54 | 19.15 |     100 |
|  7503 |      54 | 19.45 |      50 |
| 22598 |      54 | 19.75 |     150 |
| 30127 |     100 | 30.20 |     200 |
| 22569 |     100 | 30.35 |     150 |
| 15033 |     100 | 30.35 |     100 |
|  7460 |     100 | 30.90 |      50 |
| 15084 |     115 | 25.35 |     100 |
|  7533 |     115 | 25.65 |      50 |
| 22623 |     115 | 25.75 |     150 |
| 30152 |     115 | 26.20 |     200 |
+-------+---------+-------+---------+

需要获得以下输出。

id,     item_id,     price,     counter
22598   1           19.75       150
7460    2           30.90       50  
30152   3           26.20       200

ps:暂时忽略时间戳。

1 个答案:

答案 0 :(得分:-1)

你不应该加入,只需尝试一个子选择,即:

SELECT p.id, p.counter, p.max_price FROM
(SELECT item_id, MAX( price ) as max_price
FROM prices
WHERE ts
BETWEEN  '2017-07-28 00:00:00'
AND  '2017-07-28 23:59:59'
GROUP BY item_id) AS p;