ホームページ >データベース >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() は、2 つの集計テーブルから最も古い日付を選択します。この方法により、合計する前の結合に固有の乗算の問題が回避されます。

以上がMySQL でテーブルを結合するときに SUM の乗算結果を回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。