MYSQL 左联接遗漏了行
MYSQL left join missing out rows
我有 4 张桌子。
1st table has: date and revenue
2nd table has: date and cost
3rd table has: date and fees
4th table has: date and others
我正在使用以下公式计算最终收入值:
final = revenue - (cost + fees + others)
为了执行此操作,我在对所有这 4 个表执行左外连接时使用合并操作。由于连接顺序在左外很重要,所以当没有收入或成本时,我错过了费用。
Join order is revenue => cost => fees => others tables on date.
如果收入/成本缺失但费用/其他存在,我如何在缺失日期显示这些缺失的行?
我认为你需要:
SELECT `date`, COALESCE(t1.revenue, 0)
- COALESCE(t2.cost, 0)
- COALESCE(t3.fees, 0)
- COALESCE(t4.others, 0) final
FROM ( SELECT `date` FROM t1
UNION
SELECT `date` FROM t2
UNION
SELECT `date` FROM t3
UNION
SELECT `date` FROM t4 ) dates
LEFT JOIN t1 USING (`date`)
LEFT JOIN t2 USING (`date`)
LEFT JOIN t3 USING (`date`)
LEFT JOIN t4 USING (`date`)
如果date
列在每个table中未定义为唯一(客户端检查是不够的!)那么你必须添加GROUP BY并对输出表达式中的每个钱 (?) 列使用 SUM()。
我有 4 张桌子。
1st table has: date and revenue
2nd table has: date and cost
3rd table has: date and fees
4th table has: date and others
我正在使用以下公式计算最终收入值:
final = revenue - (cost + fees + others)
为了执行此操作,我在对所有这 4 个表执行左外连接时使用合并操作。由于连接顺序在左外很重要,所以当没有收入或成本时,我错过了费用。
Join order is revenue => cost => fees => others tables on date.
如果收入/成本缺失但费用/其他存在,我如何在缺失日期显示这些缺失的行?
我认为你需要:
SELECT `date`, COALESCE(t1.revenue, 0)
- COALESCE(t2.cost, 0)
- COALESCE(t3.fees, 0)
- COALESCE(t4.others, 0) final
FROM ( SELECT `date` FROM t1
UNION
SELECT `date` FROM t2
UNION
SELECT `date` FROM t3
UNION
SELECT `date` FROM t4 ) dates
LEFT JOIN t1 USING (`date`)
LEFT JOIN t2 USING (`date`)
LEFT JOIN t3 USING (`date`)
LEFT JOIN t4 USING (`date`)
如果date
列在每个table中未定义为唯一(客户端检查是不够的!)那么你必须添加GROUP BY并对输出表达式中的每个钱 (?) 列使用 SUM()。