2016-10-11 6 views
1

私はMySQLでLaravelとEloquentを使用しています。本質的に私は、彼らの「合計」と「支払った」金額を含む請求書から結果を得ようとしています。複数のテーブルからの合計の追加

私は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 

問題は私が持っている結果は常に1行だけを返します(テストDBには5つの請求書があります)、「合計」または「支払った」金額は正しくありません。

私は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

関連する問題