SQL“GROUP BY”问题

我正在设计一个购物车.为了规避产品价格变动后显示不准确定价的旧发票问题,我将价格栏从产品表转到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

使用SELECT和GROUP BY查找每个产品的最新价格,我想出了:

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

返回的日期和pid是准确的.我收到了每个独特的pid完全一个条目,伴随的日期是该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的日期,并可以获取最新的日期,如您所要求的最大(日期),但选择返回最有效率的价格,以便他检索 – 您没有为该列提供 aggregate function (实际上你的第一个查询是无效的sql)

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

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

但是,如果您访问最新的价格(我认为您所做的),建议您将旧列添加到原始表中以保存最新值,如果您可以再次更改数据库结构的选项.

相关文章

(一)日志传送架构 (1.1)相关服务器 主服务器 :用于生产的服务器,上面运行这生产SQL Server数据库...
(一)事故背景 最近在SQL Server 2012生产数据库上配置完事物复制(发布订阅)后,生产数据库业务出现了...
(一)测试目的 目前公司使用的SQL SERVER 2012高可用环境为主备模式,其中主库可执行读写操作,备库既...
(一)背景个人在使用sql server时,用到了sql server的发布订阅来做主从同步,类似MySQL的异步复制。在...
UNION和OR谓词 找出 product 和 product2 中售价高于 500 的商品的基本信息. select * from product wh...
datawhale组队学习task03