首頁 > 資料庫 > mysql教程 > 在 MySQL 中連接表格時如何避免 SUM 結果相乘?

在 MySQL 中連接表格時如何避免 SUM 結果相乘?

Linda Hamilton
發布: 2025-01-19 14:32:09
原創
970 人瀏覽過

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板