避免 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>
子查询(m
和 t
)分别独立计算 drive_time
和 tm_hours
的总和,并按 ds_id
和 week
分组。 然后,使用 bhds_teachers
和匹配的 i
数字将这些聚合结果与 ds_id
(别名为 week
)连接起来。 LEAST()
从两个聚合表中选择最早的日期。此方法避免了求和前连接所固有的乘法问题。
以上是在 MySQL 中连接表时如何避免 SUM 结果相乘?的详细内容。更多信息请关注PHP中文网其他相关文章!