MySQL 多重联接导致两列都发生变化

标签 mysql sql join

我有一个用于管理商店销售的数据库。我正在尝试编写一个查询来获取每张发票的总成本和支付的总金额。

所有付款都记录在“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/

相关文章:

mysql - 如何使用外键条件的左连接?

php - 从mysql中删除数组

java - Spring JdbcTemplate 在创建存储过程时抛出错误

mysql - 从hadoop更新mysql记录

php - mysql查询具有联合和限制的多表

mysql - 在 MySQL 表之间移动行

mysql - 我们如何在 bigquery 中使用标准 SQL 更改列的数据类型?

android - 连接以从两个表中获取数据

mysql - 在两列表中查找对并连接成三列表

r - 如何加入位置数据(纬度,经度)