首页 >数据库 >mysql教程 >在 MySQL 中连接表时如何避免 SUM 结果相乘?

在 MySQL 中连接表时如何避免 SUM 结果相乘?

Linda Hamilton
Linda Hamilton原创
2025-01-19 14:32:091010浏览

How Can I Avoid Multiplied SUM Results When Joining Tables in MySQL?

避免 MySQL 连接中出现相乘的 SUM 结果

MySQL 连接与 SUM 聚合结合使用时,由于笛卡尔积效应,通常会产生不准确、夸大的结果。 多个联接可能会导致行重复,从而导致 SUM 值膨胀。 解决方案是使用子查询预先聚合数据。

有效策略:通过子查询实现精准聚合

为了防止 SUM 膨胀,请在连接表之前执行聚合。这是通过子查询来实现的,子查询独立地对数据进行分组和求和,然后连接聚合结果。

查询示例及说明:

此查询演示了如何在使用 SUM 聚合时正确连接表:

<code class="language-sql">SELECT 
    i.last_name, 
    i.first_name, 
    DATE_FORMAT(LEAST(m.mil_date, t.tm_date), '%m/%d/%y') AS dates, 
    t.total, 
    m.minutes
FROM 
    bhds_teachers AS i
LEFT JOIN (
    SELECT 
        ds_id, 
        YEARWEEK(mil_date) AS week, 
        MIN(mil_date) AS mil_date, 
        SUM(drive_time) AS minutes
    FROM 
        bhds_mileage
    WHERE 
        mil_date BETWEEN '2016-04-11' AND '2016-04-30'
        AND ds_id = 5
    GROUP BY 
        ds_id, week
) AS m ON m.ds_id = i.ds_id
LEFT JOIN (
    SELECT 
        ds_id, 
        YEARWEEK(tm_date) AS week, 
        MIN(tm_date) AS tm_date, 
        SUM(tm_hours) AS total
    FROM 
        bhds_timecard
    WHERE 
        tm_date BETWEEN '2016-04-11' AND '2016-04-30'
        AND ds_id = 5
    GROUP BY 
        ds_id, week
) AS t ON t.ds_id = i.ds_id AND t.week = m.week;</code>

子查询(mt)分别独立计算 drive_timetm_hours 的总和,并按 ds_idweek 分组。 然后,使用 bhds_teachers 和匹配的 i 数字将这些聚合结果与 ds_id(别名为 week)连接起来。 LEAST() 从两个聚合表中选择最早的日期。此方法避免了求和前连接所固有的乘法问题。

以上是在 MySQL 中连接表时如何避免 SUM 结果相乘?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn