我正在设计一个购物车.为了避免在产品价格发生变化后显示不准确定价的旧发票问题,我将价格字段从Product表移动到ProductPrice表中,该表包含3个字段,pid,日期和价格.pid和date构成表的主键.这是表格的示例:
pid date price
1 1/1/09 50
1 2/1/09 55
1 3/1/09 54
Run Code Online (Sandbox Code Playgroud)
使用SELECT并GROUP BY查找每种产品的最新价格,我提出:
SELECT pid, price, max(date) FROM ProductPrice GROUP BY pid
Run Code Online (Sandbox Code Playgroud)
返回的日期和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
Run Code Online (Sandbox Code Playgroud)
虽然重写的语句现在产生了正确的价格(54),但这样一个简单的声音查询需要内部联接才能执行似乎令人难以置信.我的问题是,我的第二个陈述是完成我需要做的最简单的方法吗?或者我在这里遗漏了什么?提前致谢!
詹姆士