我有一个用于管理商店销售的数据库。我正在尝试编写一个查询来获取每张发票的总成本和支付的总金额。
所有付款都记录在“invoice_ payments”表中。发票的总成本是 job_price + 所有 stock_unit 项目(产品)。
“发票”表:
invoice_id job_price
000071 100.00
“stock_unit”表:
unit_id price invoice_id
000261 10 000071
000262 10 000071
000263 10 000071
“发票付款”表:
payment_id invoice_id amount
000074 000071 100.00
000075 000071 30.00
查询:
SELECT
invoice.invoice_id,
SUM(stock_unit.`sold_price` + invoice.job_price) AS price,
SUM(`invoice_payments`.`amount`) AS paid
FROM invoice
LEFT JOIN stock_unit
ON stock_unit.invoice_id = invoice.invoice_id
LEFT JOIN invoice_payments
ON invoice_payments.invoice_id = invoice.invoice_id
GROUP BY invoice.invoice_id
当只有 1 个联接时,查询按预期工作,但当添加 2 个联接时,它们会相互影响。
在添加“invoice_ payments”加入之前:
invoice_id paid
000071 130.00
之后:
invoice_id price paid
000071 660.00 390.00
应该是什么:
invoice_id price paid
000071 130.00 130.00
SQL Fiddle 无法正常工作,但我在这里放置了一个架构,以便您可以更好地了解我的表:http://sqlfiddle.com/#!9/091a35
我最好有 3 个单独的查询并将它们连接起来吗?
最佳答案
您应该选择e分隔的结果,而不是计算两者的结果是连接的同一查询
SELECT t1.invoce_id, t1.price, t2.paid FROM
(
SELECT
invoice.invoice_id AS invoce_id,
SUM(stock_unit.`sold_price` + invoice.job_price) AS price
FROM invoice
LEFT JOIN stock_unit
ON stock_unit.invoice_id = invoice.invoice_id
GROUP BY invoice.invoice_id ) AS t1
LEFT JOIN
(
SELECT
invoice.invoice_id AS invoce_id,
SUM(`invoice_payments`.`amount`) AS paid
FROM invoice
LEFT JOIN invoice_payments
ON invoice_payments.invoice_id = invoice.invoice_id
GROUP BY invoice.invoice_id ) AS t2
ON t1.invoce_id = t2.invoce_id
关于MySQL 多重联接导致两列都发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40529445/