SQL“GROUP BY”问题

前端之家收集整理的这篇文章主要介绍了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)

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

猜你在找的MsSQL相关文章