使用聚合函数时如何从一行中获取其他列?

时间:2014-03-10 01:27:04

标签: mysql sql

我很尴尬地说,我一直试图在数小时内完成这项工作而没有成功。我已经在StackOverflow上阅读了几十个类似的问题并尝试了无数不同的东西,但我对SQL的掌握还不够,无法实现我想要实现的目标。

我有两个表,productsproduct_prices。为简单起见,假设它们如下所示:

products:
id   


product_prices:
id | p_id | price | date_added

我需要做的是获取最近添加的价格,以及添加价格的日期。换句话说,对于每个产品,我需要获取最新的pricedate_added(以及产品ID,p_id,当然)。

如果我只需要知道一个ID已知的产品的最新日期和价格,那么我可以这样做:

SELECT price, date_added 
FROM product_prices
WHERE p_id = 1
ORDER BY date_added DESC LIMIT 1

但是,当我需要获取所有产品的最新日期和价格时,此类查询将无效。

我认为解决方案是将MAX()聚合函数与GROUP BY和子查询结合使用,但我根本无法使其工作。

这是一个关于SQL Fiddle的测试数据库:http://sqlfiddle.com/#!2/881cae/3

我意识到这里有很多类似的问题,但我已经阅读了很多这些问题并且无法解决我的问题,所以我希望直接帮助而不是只是哭“重复!”并链接到另一个帖子。谢谢。

编辑:SQL Fiddle目前似乎已经失败,所以这里是我在那里的数据库架构:

CREATE TABLE products
(
  id int auto_increment primary key, 
  name varchar(20)
);

INSERT INTO products
(
  name
)
VALUES
('product 1'),
('product 2');


CREATE TABLE product_prices
(
  id int auto_increment primary key, 
  p_id int, 
  price decimal(10,2),
  date_added int
);

INSERT INTO product_prices
(
  p_id, 
  price, 
  date_added
)
VALUES
(1, 1.99, 1000),
(1, 2.99, 2000),
(1, 3.99, 3000),
(1, 4.99, 4000),
(1, 5.99, 5000),
(1, 6.99, 6000),


(2, 1.99, 1000),
(2, 2.99, 2000),
(2, 3.99, 3000),
(2, 4.99, 4000),
(2, 5.99, 5000),
(2, 6.99, 6000);

4 个答案:

答案 0 :(得分:4)

以下是如何做到这一点:

SELECT pp.*
FROM product_prices pp
JOIN (
    SELECT p_id, MAX(date_added) as max_date
    FROM product_prices
    GROUP BY p_id
) x ON pp.p_id = x.p_id AND pp.date_added = x.max_date

我们的想法是为每个产品ID(即内部查询)创建一组元组{p_id, max_date},并使用这些元组过滤product_prices数据(即ON子句。内连接)。

Demo on sqlfiddle.

答案 1 :(得分:0)

SELECT
distinct on(p_id)
price,
date_added 
FROM product_prices
ORDER BY p_id, date_added DESC

OR

SELECT
price
date_added 
FROM product_prices

join (
SELECT
p_id
max(date_added) as max_date
FROM product_prices
group by p_id
) as last_price on last_price.p_id = product_prices.p_id
and last_price.max_date = product_prices.date_added

既没有测试,也可能包含一两个错误

答案 2 :(得分:0)

试一试,虽然这不是一个优雅的解决方案:

SELECT pp1.price, pp1.date_added 
FROM product_prices pp1
WHERE pp1.date_added IN (SELECT MAX(pp2.date_added)
FROM product_prices pp2 WHERE pp2.p_id =  pp1.p_id )

Group by pp1.p_ID

答案 3 :(得分:-1)

Select price, date_added from product_prices 
where date_added =
(select max(date_added)
from product_prices
group by p_id)

这就是你想要的吗?