次のクエリを検討してください。
ユーザーのすべてpayment
の を選択UNION
し、ユーザーの で結果を選択しますinvoice
。
SELECT `id`,
`amount` AS `value`,
'PAYMENT' AS `transaction_type`
FROM `payment`
WHERE `user_id` = $user_id
UNION ALL
SELECT `i`.`id`,
(-1) * SUM(`ii`.`unit_price` * `ii`.`quantity`) AS `value`,
'INVOICE' AS `transaction_type`
FROM `invoice` `i`
JOIN `invoiceitem` `ii` ON `ii`.`invoice_id` = `i`.`id`
WHERE `user_id` = $user_id AND `type` = 'invoice'
問題は、支払いも請求書もないユーザーの場合、次のように不要な行が返されることです。
id | value | transaction_type
=================================
NULL | 0 | NULL
しかし、ある程度のデータを持っているユーザーにとっては、結果は完全に予期されたものです。
重要な編集
さらに調査した結果、問題は以下の2番目のサブクエリにあるはずであることがわかりました。
SELECT i.id,
(-1) * SUM(ii.unit_price * ii.quantity) AS `value`,
'INVOICE' AS `trans_type`
FROM invoice i
JOIN invoiceitem ii ON ii.invoice_id = i.id
WHERE user_id = 4 AND type = 'invoice'
以下を返します。
id | value | transaction_type
=================================
NULL | NULL | INVOICE
もちろん、ユーザーにuser_id = 4
はまだ請求書がありません。しかし、いくつかの請求書を持っている別のユーザーの場合、結果は OK です。