我有一个复杂的查询问题(至少对我来说);我已经使用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/

10-13 08:57