【发布时间】:2021-04-22 02:21:09
【问题描述】:
我一直在研究费用跟踪系统。我有三个主要表格:'expenses'、'expense_reports'、'payments'。
我的数据库结构是这样的:
- “费用”属于一个“费用报告”
- “expense_reports”有很多“费用”
- “expense_reports”属于许多“付款”
- “付款”属于许多“费用报告”
我为“expense_reports”和“payments”表添加了一个数据透视表,即“expense_report_payment”,以处理多对多关系。 'expense_report_payment' 表有 ff 字段:
- 身份证
- expense_report_id
- payment_id
- 付款
这是我获取费用和付款总额的查询:
SELECT SUM(ex.`amount`) AS total_expenses, SUM(erp.`payment`) AS total_payment FROM `expenses` ex
JOIN `expense_reports` er ON er.`id` = ex.`expense_report_id`
LEFT JOIN `expense_report_payment` erp ON erp.`expense_report_id` = er.`id`
LEFT JOIN `payments` p ON p.`id` = erp.`payment_id`
WHERE ex.`deleted_at` IS NULL
AND er.`deleted_at` IS NULL
AND er.`rejected_at` IS NULL
AND er.`cancelled_at` IS NULL
AND p.`deleted_at` IS NULL
AND p.`cancelled_at` IS NULL
AND p.`received_at` IS NOT NULL
即使还没有付款,我也使用 LEFT JOIN 来显示费用结果。但是,我得到了 NULL 结果。
【问题讨论】:
-
好吧....
AND p.received_at IS NOT NULL使得LEFT JOIN和payments实际上是INNER JOIN,因为这个条件实际上是一个需要一个付款人 -
天哪。它确实提供了我想要的。但如果有付款,我需要它。只有在收到完成交易的情况下才能考虑付款。