我有一个复杂的查询问题(至少对我来说);我已经使用for循环完成了此操作,但我想知道是否有更好的解决方案。
我有3张桌子。
表:pnmaster
PN(主键)
描述
类型
表:购买
PN(非主要)
数量
日期
表:消耗
PN(非主要)
数量
日期
我想执行一个查询,该查询从pnmaster中选择Type =“ X”的PN,并加入每个PN对应的最新购买和最新消费及其数量。我尝试了以下代码,并与1个Join一起正常工作,但与2个一起,它至少可以挂起10分钟。
SELECT pnmaster.PN,pnmaster.Description,buy.Quantity,consume.Quantity,
MAX(consume.Date),MAX(buy.Date) FROM pnmaster
INNER JOIN consume ON pnmaster.PN=consume.PN
INNER JOIN buy ON pnmaster.PN=buy.PN WHERE(pnmaster.Type='X')
GROUP BY PN;
以pnmaster开头的示例:
PN Desc
A Seal
B Screw
C Hammer
购买:
PN Qty Date
A 2 01/01/2013
A 3 01/02/2014
B 1 01/07/2011
C 7 01/05/2014
C 4 01/03/2012
C 3 01/02/2013
消耗:
PN Qty Date
A 4 01/01/2010
A 7 01/02/2012
B 3 01/07/2010
C 1 01/05/2013
C 9 01/03/2011
C 3 01/02/2015
预期结果:
PN Desc LastBuy LastConsume LastBuyDate LastConsumeDate
A Seal 3 7 01/02/2014 01/02/2012
B Screw 1 3 01/07/2011 01/07/2010
C Hammer 3 3 01/02/2013 01/02/2015
最佳答案
对此可能有更好的查询...但是您可以使用:
SELECT
m.PN
,m.Description
,(
SELECT Quantity FROM buys WHERE Date = (
SELECT MAX(Date) FROM buys WHERE PN = m.PN
)
) AS LastBuyQty
,(
SELECT MAX(Date) FROM buys WHERE PN = m.PN
) AS LastBuyDate
,(
SELECT Quantity FROM consumes WHERE Date = (
SELECT MAX(Date) FROM consumes WHERE PN = m.PN
)
) AS LastConsumeQty
,(
SELECT MAX(Date) FROM consumes WHERE PN = m.PN
) AS LastConsumeDate
FROM pnmaster AS m
WHERE m.PN = 'A';
关于mysql - 用MAX函数联接3个表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29572237/