我正在设计一个购物车.为了规避产品价格变动后显示不准确定价的旧发票问题,我将价格栏从产品表转到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)
但是,如果您访问最新的价格(我认为您所做的),建议您将旧列添加到原始表中以保存最新值,如果您可以再次更改数据库结构的选项.