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

Mysql 使用聚合函数时,如何从行中获取其他列?,mysql,sql,Mysql,Sql,我很难为情地说,我已经尝试了好几个小时,但都没有成功。我已经阅读了几十个关于StackOverflow的类似问题,并尝试了无数不同的方法,但我对SQL的掌握还不够好,无法实现我想要实现的目标 我有两个表,产品和产品价格。为简单起见,假设它们如下所示: products: id 我需要做的是获得最近添加的价格,以及添加价格的日期。因此,换句话说,对于每种产品,我需要获得最新的价格和添加日期(当然还有产品id,p\u id) 如果我只需要获取一个ID已知的产品的最新日期和价格,那么我可以使

我很难为情地说,我已经尝试了好几个小时,但都没有成功。我已经阅读了几十个关于StackOverflow的类似问题,并尝试了无数不同的方法,但我对SQL的掌握还不够好,无法实现我想要实现的目标

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

products:
id   

我需要做的是获得最近添加的价格,以及添加价格的日期。因此,换句话说,对于每种产品,我需要获得最新的
价格
添加日期
(当然还有产品id,
p\u id

如果我只需要获取一个ID已知的产品的最新日期和价格,那么我可以使用以下方法:

SELECT price, date_added 
FROM product_prices
WHERE p_id = 1
ORDER BY date_added DESC LIMIT 1
但是,当我需要获取所有产品的最新日期和价格时,这种类型的查询将不起作用

我认为解决方案是将
MAX()
聚合函数与
groupby
和子查询结合使用,但我无法让它工作

以下是SQL FIDLE上的测试数据库:

我意识到这里有很多类似的问题,但我已经读了很多,还没有解决我的问题,所以我希望能得到直接的帮助,而不是哭喊“重复!”并链接到另一个帖子。多谢各位

编辑: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);
这是你想要的吗

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


这两个测试都可能包含一个或两个bug,请尝试一下,尽管这不是一个优雅的解决方案:

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

以下是您如何做到这一点:

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\u id,max\u date}
,并使用这些元组(即内部联接中的
ON
子句)过滤
产品价格
数据


date\u added不足以确保它是正确的产品价格。我最后一次尝试的结果几乎与此相同,但我陷入了困境,因为我无法确定如何从子查询到外部查询(我认为这是不可能的)获取
product\u prices
行的id。在我的例子中,您使用这两条信息在正确的行上连接的解决方案非常有效。谢谢
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
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
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