gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 01:58:12 28 4
gpt4 key购买 nike

我很尴尬地说,我已经尝试了好几个小时但没有成功。我在 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);

最佳答案

这里是你如何做到的:

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.

关于mysql - 使用聚合函数时如何从一行中获取其他列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22290634/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com