mysql用总和加入3个表给出错误的结果

Posted

技术标签:

【中文标题】mysql用总和加入3个表给出错误的结果【英文标题】:mysql joining 3 tables with sum gives wrong result 【发布时间】:2016-11-19 23:52:13 【问题描述】:

我一直在尝试使用 3 张表格制作资产负债表。第一个表是供应商的名称。第二个表是由于供应商,第三个表是对供应商的付款,两者都与供应商表的外键连接。

我期待这样的结果:

供应商名称----------------------到期--------------------- ---------- 付款

名称------------------ 总和(数量*单价) ------------------sum(支付金额)

我的查询是

SELECT 
    tbl_supplier.supplier_name AS supplier,
    SUM(tbl_payment.pay_amount) AS payment,
    SUM(tbl_stock.stock_qnt * tbl_stock.stock_up) AS due
FROM
    tbl_supplier
        INNER JOIN
    tbl_payment ON tbl_supplier.id = tbl_payment.supplier_id
        INNER JOIN
    tbl_stock ON tbl_supplier.id = tbl_stock.supplier_id
GROUP BY supplier_name

但结果是到期金额乘以付款次数,反之亦然。

例如,如果供应商的应付总额为 1000,而他已支付 3 次,则其显示的应付总额为 3000,而不是 1000。

请帮忙。谢谢

【问题讨论】:

你是否真正做到了 DISTINCT? 【参考方案1】:

您不能join 股票和付款表。 join 会将tbl_payment 中的每一行与tbl_stock 中的每一行结合起来,因此tbl_payment 中的每一行有3 行,您将得到tbl_stock 中的第一行3 次,然后对这些求和。 Distinct 不是解决方案,因为它会忽略那些不明显的值,例如如果您实际上有 2 笔 100 美元的付款,那么您将有一笔不同的金额为 100 美元(因为 100 美元和 100 美元的价值相同)。

您可以使用子查询分别计算总和(这是 tbl_suppliertbl_paymenttbl_suppliertbl_stocks 的隐含 join,但不是所有三个一起计算):

SELECT 
   tbl_supplier.supplier_name AS supplier,
   (select sum(tbl_payment.pay_amount) 
    from tbl_payment 
    where tbl_payment.supplier_id = tbl_supplier.id) as payment,
   (select sum(tbl_stock.stock_qnt * tbl_stock.stock_up) 
    from tbl_stock
    where tbl_stock.supplier_id = tbl_supplier.id) as due
from tbl_supplier;

【讨论】:

谢谢 Solarflare。你说的对。 DISTINCT 不是解决方案,因为它不计算多个相同的值。您的代码似乎正在运行。让我检查一下,然后回复你。【参考方案2】:

user5599807 建议的解决方案

 SELECT DISTINCT
        tbl_supplier.supplier_name AS supplier,
        SUM(DISTINCT tbl_payment.pay_amount) AS payment,
        SUM(DISTINCT tbl_stock.stock_qnt * tbl_stock.stock_up) AS due
    FROM
        tbl_supplier
            INNER JOIN
        tbl_payment ON tbl_supplier.id = tbl_payment.supplier_id
            INNER JOIN
        tbl_stock ON tbl_supplier.id = tbl_stock.supplier_id
    GROUP BY supplier_name

【讨论】:

这行不通(至少在一般情况下不行)!如果您多次支付相同的付款金额,例如如果您支付 100 美元、100 美元和 200 美元,您的不同金额将为 300 美元(因为您有不同的(=不同)值 100 美元和 200 美元)。如果您多次订购相同数量的产品,结果相同。您不能连接所有 3 个表,但必须使用子查询。我会添加一个答案。

以上是关于mysql用总和加入3个表给出错误的结果的主要内容,如果未能解决你的问题,请参考以下文章

Sphinxsearch:加入 3 个表

Mysql查询加入5个表

加入多个表并应用聚合给出错误的结果

来自第二个表的 MySQL INNER JOIN (TOP10)

如何结合 3 个表的结果来计算 MySql 中的平均分?

MySQL JOIN 多个查询结果到 1 个结果集