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
私はこれをあまりにも長く注視してきたと思います。そうしたようだ。 – Romulo