2016-10-11 4 views
1

Я использую 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 

ответ

2

Добавить GROUP BY invoices.id после WHERE

+0

Я думаю, что я слишком долго смотрел на это. Кажется, это и было. – Romulo

Смежные вопросы