避免在 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中文網其他相關文章!