私はinvoices
テーブルを持っています。各請求書には多数のinvoice_items
and transactions
(または、必要に応じて「支払い」) があります。請求書ごとに、支払額 (つまり、そのトランザクションの金額の合計) と合計金額 (つまり、アイテムの金額の合計) を計算したいと考えています。
次のクエリを作成しました。
SELECT
invoices.*,
SUM(transactions.amount_cents) AS amount_paid,
SUM(invoice_items.quantity * invoice_items.price_cents) AS total
FROM invoices
RIGHT JOIN transactions
ON invoices.id = transactions.invoice_id
RIGHT JOIN invoice_items
ON invoices.id = invoice_items.invoice_id
ただし、total
何らかの理由で、フィールドの値にトランザクション数が乗算されます (たとえば、合計金額が20でトランザクションが2total
の請求書がある場合、フィールドは40になります)。
クエリからトランザクションへの参照をすべて削除すると、次のようになります。
SELECT
invoices.*,
SUM(invoice_items.quantity * invoice_items.price_cents) AS total
FROM invoices
RIGHT JOIN invoice_items
ON invoices.id = invoice_items.invoice_id
total
フィールドは正しく返されます...
私はこの問題の専門家ではないので、おそらく非常にばかげたことをしているのでしょう。JOIN のさまざまな組み合わせを既に試しましたが、結果はありません。
ヒントはありますか?
編集:セミファイナルソリューション
未払いの請求書を取得しようとしていたので、最後のクエリは次のとおりです。
SELECT
invoices.*,
SUM(invoice_items.quantity * invoice_items.price_cents) AS total,
t.amount_paid
FROM invoices
LEFT JOIN invoice_items
ON invoice_items.invoice_id = invoices.id
LEFT JOIN (
SELECT
invoice_id,
SUM(transactions.amount_cents) AS amount_paid
FROM transactions
GROUP BY invoice_id
) t
ON invoices.id = t.invoice_id
GROUP BY invoices.id
HAVING amount_paid >= total;
編集:参加する必要がないことに気付いた後...
関連するデータを取得する必要はありません。請求書が支払われたか未払いかを知りたいだけです。だから私は単純な場所を使用することになりました:
SELECT `invoices`.*
FROM `invoices`
WHERE (
(
SELECT COALESCE(SUM(t.amount_cents), 0)
FROM transactions t
WHERE t.invoice_id = invoices.id
)
>=
(
SELECT COALESCE(SUM(i.quantity * i.price_cents), 0)
FROM invoice_items i
WHERE i.invoice_id = invoices.id
)
)
しかし、助けてくれたみんなに感謝します。