gpt4 book ai didi

SQL "GROUP BY"问题

转载 作者:IT老高 更新时间:2023-10-29 00:21:32 25 4
gpt4 key购买 nike

我正在设计一个购物车。为了避免旧发票在产品价格更改后显示不准确定价的问题,我将 Product 表中的 price 字段移动到 ProductPrice 表中,该表包含 3 个字段,pid、date 和 price。 pid 和 date 构成表的主键。下面是表格的示例:

pid    date     price
1 1/1/09 50
1 2/1/09 55
1 3/1/09 54

使用 SELECTGROUP BY 找到每个产品的最新价格,我想出了:

SELECT pid, price, max(date) FROM ProductPrice GROUP BY pid

返回的日期和 pid 准确无误。对于每个唯一的 pid,我正好收到 1 个条目,并且伴随它的日期是该 pid 的最新日期。然而,令人惊讶的是价格返回。它返回与 pid 匹配的第一行的价格,在本例中为 50。

修改我的声明后,我想出了这个:

SELECT pp.pid, pp.price, pp.date FROM ProductPrice AS pp
INNER JOIN (
SELECT pid AS lastPid, max(date) AS lastDate FROM ProductPrice GROUP BY pid
) AS m
ON pp.pid = lastPid AND pp.date = lastDate

虽然重新设计的语句现在产生了正确的价格(54),但如此简单的查询需要内部连接才能执行,这似乎令人难以置信。我的问题是,我的第二个陈述是完成我需要做的最简单的方法吗?或者我在这里错过了什么?提前致谢!

詹姆斯

最佳答案

您得到任意价格的原因是如果您 GROUP BY 某些东西,mysql 无法知道要选择哪些列。它知道每个 pid 需要 a 价格和 a 日期,并且可以按照您使用 max(date) 的请求获取最新日期,但选择返回对他来说最有效的检索价格 - 您没有提供 aggregate function对于该列(实际上,您的第一个查询不是有效的 SQL。)

您的第二个查询看起来不错,但这里有一个更短的选择:

SELECT pid, price, date
FROM ProductPrice p
WHERE date = (SELECT MAX(date) FROM ProductPrice tmp WHERE tmp.pid = p.pid)

但是,如果您经常访问最新价格(我认为您会这样做),如果您可以选择再次更改数据库结构,我建议您将旧列添加回原始表以保存最新值。

关于SQL "GROUP BY"问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1762018/

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