2017-04-26 124 views
2

我的查询返回2个子表的2列不正确的总和,我搜索谷歌,也看到了对stackoverflow的建议,但他们从来没有工作。Mysql总和查询返回不正确的结果,当使用多个连接

si_invoices 
    ----------------------------- 
    id, date 
    1, 2014-05-07 


    si_invoice_items 
    ----------------------------- 
    id, invoice_id, date , total 
    1, 100, 2014-05-07, 200 
    2, 100, 2014-05-07, 200 

    si_payment 
    ----------------------------- 
    id, ac_inv_id, date , payment 
    1, 100, 2014-05-07, 100 
    2, 100, 2014-05-07, 200 

    SELECT SI.*,SUM(SII.total) as total,SUM(SIP.payment) as payment FROM 
     (SELECT * FROM si_invoices GROUP BY si_invoices.id) AS SI 
    LEFT JOIN si_invoice_items SII ON SII.invoice_id = SI.id 
    LEFT JOIN si_payment SIP ON SIP.ac_inv_id = SII.invoice_id 
    GROUP BY SI.id 

它应该返回400总和字段'总'在SQL中,但它返回800和'付款'相同。你能指出我的查询中有什么错误。请帮助,感激。

感谢 M.S

+0

显示预期的结果,你想 –

+0

我已经解释期望的结果。请通过这个问题。它应该返回400作为总和,但它实际上返回800. –

+0

1.SELECT * FROM si_invoices GROUP BY si_invoices.id必须给出语法错误。 “分组依据”只有一列,并且您尝试获取多个列。 – Kapil

回答

1

使用总计直接,因为你的加入一个重新创建更多的行组合,你想要的。

尝试以下操作:

SELECT id, MAX(Total) as FinalTotal ,MAX(Payment) as FinalPayment 
FROM si_invoices a 
    left join 
    (select invoice_id, sum(total) as Total from si_invoice_items group by invoice_id) b 
    on a.id = b.invoice_id 
    left join 
    (select ac_inv_id, sum(payment) as Payment from si_payment group by ac_inv_id) c 
    on c.ac_inv_id = a.id 
group by id 

,或者如果ID是唯一的:

SELECT * 
FROM si_invoices a 
    left join 
    (select invoice_id, sum(total) as Total from si_invoice_items group by invoice_id) b 
    on a.id = b.invoice_id 
    left join 
    (select ac_inv_id, sum(payment) as Payment from si_payment group by ac_inv_id) c 
    on c.ac_inv_id = a.id 
+0

感谢您的回答,您的第二个查询完美工作。 –

0

详细结果:

select a.invoice,ac_inv_id,sum(a.total),sum(b.payment) from 
(select 1 as id, 100 as invoice, '2014-05-07' as date, 200 as total union all 
select 2, 100, '2014-05-07', 200) as a 
left join 
(select 1 as id, 100 as ac_inv_id, '2014-05-07' as date, 100 as payment union all 
select 2, 100, 2014-05-07, 200) as b 
on a.id = b.id 

最终查询:

select a.invoice,ac_inv_id,sum(a.total),sum(b.payment) from 
(select * from si_invoice_items) as a 
left join 
(select * from si_payment) as b 
on a.id = b.id 

结果:

100 100 400 300