请考虑以下查询:
选择payment
一个用户的所有 s 和UNION
该用户的invoice
s 的结果。
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
但是对于有一些数据的用户来说,结果完全是意料之中的。
重要编辑
经过更多研究,我发现问题应该来自下面的第二个子查询:
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
还没有任何发票。但是对于另一个有一些发票的用户,结果是可以的。