You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

MySQL多表Join查询结果异常问题咨询

解决多表Join后汇总结果不一致的问题

嘿,这个坑我踩过!单独查每张表的分组汇总都没问题,一旦Join起来结果就不对,核心原因就是Join操作触发了笛卡尔积,导致数据行被重复计算

问题根源

举个简单例子:假设某个advisor在shift_track里有2条记录,在shift_report里有3条记录,直接Join这两张表的话,会生成2×3=6条关联行。这时候再做sum,原来的shifttime数值会被重复累加,结果自然和单独查询的汇总值对不上。

正确的解决方案

别先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

火山引擎 最新活动