加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SQL“GROUP BY”问题

发布时间:2020-12-12 08:47:08 所属栏目:MsSql教程 来源:网络整理
导读:我正在设计一个购物车.为了规避产品价格变动后显示不准确定价的旧发票问题,我将价格栏从产品表转到ProductPrice表,其中包含3个字段,即pid,date和price. pid和date是表的主键.这是一个表的样子: pid date price1 1/1/09 501 2/1/09 551 3/1/09 54 使用SELECT
我正在设计一个购物车.为了规避产品价格变动后显示不准确定价的旧发票问题,我将价格栏从产品表转到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)

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读