MySQL多表Join查询结果异常问题咨询
解决多表Join后汇总结果不一致的问题
嘿,这个坑我踩过!单独查每张表的分组汇总都没问题,一旦Join起来结果就不对,核心原因就是Join操作触发了笛卡尔积,导致数据行被重复计算。
问题根源
举个简单例子:假设某个advisor在shift_track里有2条记录,在shift_report里有3条记录,直接Join这两张表的话,会生成2×3=6条关联行。这时候再做sum,原来的shift和time数值会被重复累加,结果自然和单独查询的汇总值对不上。
正确的解决方案
别先Join再汇总,应该先对每张表单独做分组汇总,再把汇总后的单行道数据做关联。这样每个advisor在每个汇总结果里只有一行,Join时就不会产生重复行,sum的结果也和单独查询一致了。
给你写个完整的SQL示例(补全了你没写完的第三张表逻辑):
-- 先分别生成每张表的汇总结果 WITH track_summary AS ( SELECT advisor, round(sum(shift),1) AS avail_time FROM shift_track WHERE date >= 20180319 GROUP BY advisor ), report_summary AS ( SELECT advisor, round(sum(time/60),1) AS standard_time FROM shift_report WHERE date >= 20180319 GROUP BY advisor ), mobile_summary AS ( SELECT advisor, round(sum(time/60),1) AS mobile_time FROM mobile_your_table_name -- 替换成你的第三张表名 WHERE date >= 20180319 -- 确保时间条件和其他表一致 GROUP BY advisor ) -- 关联三个汇总结果 SELECT -- 用COALESCE保证即使某张表没有该advisor,也能显示正确的advisor编号 COALESCE(t.advisor, r.advisor, m.advisor) AS advisor, t.avail_time, r.standard_time, m.mobile_time FROM track_summary t -- 用全外连接避免漏掉只在某一张表存在的advisor,按需改成INNER JOIN FULL OUTER JOIN report_summary r ON t.advisor = r.advisor FULL OUTER JOIN mobile_summary m ON COALESCE(t.advisor, r.advisor) = m.advisor ORDER BY advisor ASC;
额外注意事项
- 确保三张表的
advisor字段类型完全一致(比如都是字符串或整数),避免隐式类型转换导致关联不上 - 如果你的业务场景里,每个advisor一定存在于所有三张表中,可以把
FULL OUTER JOIN换成INNER JOIN,性能会更好 - 检查每张表的
date >= 20180319条件是否都正确添加了,别漏写导致数据范围不一致
内容的提问来源于stack exchange,提问作者gdr39




