Я использую Laravel и Eloquent в MySQL. По сути, я пытаюсь получить результаты от счетов-фактур, включая их «итоговые» и «платные» суммы.Добавление итогов из нескольких таблиц
У меня есть 4 таблицы:
счет
id int(10),
date_due date,
client_id int(10),
deleted_at datetime
invoices_items
id int(10),
invoice_id int(10),
price decimal(15,2),
quantity int(10)
invoices_payments (это сводная таблица, как платежи могут применяться к другим счетам тоже)
payment_id int(10),
invoice_id int(10),
amount decimal(15,2)
платежи
id int(10),
payment_date date,
total decimal(15,2)
(есть и другие поля, но они не имеют отношения)
Я использую этот запрос, на основе нескольких других ответов и других исследований:
select
`invoices`.*,
SUM(
invoices_items.price * invoices_items.quantity
) as total ,
SUM(
invoices_payments.amount
) as paid
from
`invoices`
left join `invoices_items` on `invoices`.`id` = `invoices_items`.`invoice_id`
left join `invoices_payments` on `invoices`.`id` = `invoices_payments`.`invoice_id`
where
`invoices`.`deleted_at` is null
limit
25
The проблема заключается в том, что результат всегда возвращает только 1 строку (в тестовом db есть 5 счетов-фактур), а сумма для «total» или «paid» неверна.
Я хотел бы добавить, что не может быть каких-либо записей в invoices_payments
- SOLUTION -
Вот окончательный запрос в случае, если кто работает в подобной ситуации
select
`invoices`.*,
COALESCE(SUM(
invoices_items.price * invoices_items.quantity
),0) as total,
COALESCE(SUM(invoices_payments.amount),0) as paid,
COALESCE(SUM(
invoices_items.price * invoices_items.quantity
),0) - COALESCE(SUM(invoices_payments.amount),0) as balance
from
`invoices`
left join `invoices_items` on `invoices`.`id` = `invoices_items`.`invoice_id`
left join `invoices_payments` on `invoices`.`id` = `invoices_payments`.`invoice_id`
where
`invoices`.`deleted_at` is null
group by
`invoices`.`id`
order by
`balance` desc
limit
25
Я думаю, что я слишком долго смотрел на это. Кажется, это и было. – Romulo