2015-06-10 4 views
0

У меня возник вопрос относительно MySQL.SUM строк с GROUP CONCAT и LEFT JOIN

Я получил следующие таблицы:

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) и общую сумму (Сумма стоимости).

Это результат я ожидаю:

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 

Что я делаете неправильно здесь?

ответ

2

Я думаю, что вы хотите что-то вроде следующего:

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 JOIN s репликации Invoices_positions строк, и, как следствие, SUM рассчитывается на нескольких вхождений одного и того же ряда стол.

Сначала необходимо выполнить агрегацию для таблици Invoices_positions, а затем присоединиться к таблице Invoices.

Fiddle Demo here