【问题标题】:SUM of rows with GROUP CONCAT and LEFT JOIN带有 GROUP CONCAT 和 LEFT JOIN 的行的总和
【发布时间】:2015-08-26 05:05:15
【问题描述】:

我有一个关于 MySQL 的问题。

我得到了以下表格:

Invoices
invoices_ordermapping
invoices_positions

发票:

id | userid | state
1, 10, 1

invoices_ordermapping

id | invoiceid | orderid
1, 1, Order12
2, 1, Order13

invoices_positions

id | invoiceid | value | text
1, 1, 21, Example
2, 1, 18.9, Example 2

现在我想获取分配给发票的订单(Order12,Order13)和总金额(Sum of value)。

这是我期望的结果:

Invoiceid | Orders | Sum
1, Order12, Order13, 39.9

我正在使用这个 MySQL 查询:

SELECT group_concat(DISTINCT orderid ORDER BY orderid SEPARATOR ", ") AS orderid, 
       SUM(ip.total) as value
FROM tbl_invoices as a
LEFT JOIN tbl_invoices_ordermapping as oi ON oi.invoiceid = a.id 
LEFT JOIN tbl_invoices_positions as ip on ip.invoiceid = oi.invoiceid          
GROUP BY oi.invoiceid
ORDER BY oi.invoiceid

不幸的是我得到了这个结果:

Orderid: Order12, Order12, Order13, Order13
Value: 119.69999885559082

我在这里做错了什么?

【问题讨论】:

    标签: mysql sum left-join concat


    【解决方案1】:

    我认为您想要以下内容:

    SELECT a.id AS InvoiceId, Orders, `Sum`
    FROM Invoices as a
    LEFT JOIN (SELECT invoiceid,
                      GROUP_CONCAT(DISTINCT orderid 
                                   ORDER BY orderid SEPARATOR ', ') AS Orders
               FROM Invoices_ordermapping 
               GROUP BY invoiceid ) AS oi ON oi.invoiceid = a.id
    LEFT JOIN (SELECT invoiceid, SUM(`value`) as `Sum`
               FROM Invoices_positions
               GROUP BY invoiceid) AS ip ON ip.invoiceid = a.id
    ORDER BY a.id
    

    您的查询的问题在于LEFT JOINs 复制了Invoices_positions 行,因此,SUM 是根据表中相同行的多次出现计算得出的。

    您需要先对Invoices_ordermappingInvoices_positions 表执行聚合,然后加入Invoices 表。

    Fiddle Demo here

    【讨论】:

      猜你喜欢
      • 2021-09-22
      • 2016-05-01
      • 2016-03-06
      • 1970-01-01
      • 1970-01-01
      • 2016-04-11
      • 2021-01-30
      • 2017-09-09
      • 1970-01-01
      相关资源
      最近更新 更多