Следующий запрос
SELECT
invoices.id,
SUM(payments.amount)
FROM adass.invoices
INNER JOIN adass.payments ON invoices.id=payments.id_invoice
GROUP BY invoices.id ORDER BY 1 desc LIMIT 0, 25
возвращает следующий результат
Однако, когда я присоединяю другую таблицу к запросу, вот так:
SELECT
invoices.id,
SUM(payments.amount)
FROM adass.invoices
INNER JOIN adass.invoice_items ON invoices.id=invoice_items.id_invoice
INNER JOIN adass.payments ON invoices.id=payments.id_invoice
GROUP BY invoices.id ORDER BY 1 desc LIMIT 0, 25
Он дублирует сумму платежа для счета-фактуры с идентификатором 13919, фактически удваивая платеж 100 в таблице
Чем это вызвано?
Я добавил содержание таблицы ниже
ОБНОВЛЕНИЕ: более крупный запрос следующим образом
SELECT SQL_CALC_FOUND_ROWS invoices.id,
COALESCE(SUM(invoice_items.gross),0) AS gross,
COALESCE(SUM(invoice_items.net) - SUM(invoice_items.gross),0) AS vat,
COALESCE(SUM(invoice_items.net),0) AS net,
COALESCE(SUM(payments.amount),0),
COALESCE(SUM(payments.amount) - SUM(invoice_items.net),0) AS outstanding
FROM adass.invoices
LEFT JOIN adass.invoice_items ON invoices.id=invoice_items.id_invoice
LEFT JOIN adass.payments ON invoices.id=payments.id_invoice
GROUP BY invoices.id ORDER BY 1 desc LIMIT 0, 25
Понятно что происходит. Ваш СЧЕТ № 13919 имеет два ПУНКТА СЧЕТА, следовательно, вы получаете двойной сумма оплаты счета, потому что ваш запрос генерирует две строки. Если бы у вас было три ПУНКТА СЧЕТА, то сумма была бы утроена.
Вы должны удалить это предложение из вашего запроса INNER JOIN adass.invoice_items ON invoices.id=invoice_items.id_invoice
так как вы не используете столбцы из adass.invoice_items
тем не мение.
Ваш запрос тогда будет:
SELECT invoices.id,
SUM(payments.amount)
FROM adass.invoices
INNER JOIN adass.payments ON invoices.id=payments.id_invoice
GROUP BY invoices.id ORDER BY 1 desc LIMIT 0, 25
Других решений пока нет …