ホームページ >データベース >mysql チュートリアル >MySQL でテーブルを結合するときに SUM の乗算結果を回避するにはどうすればよいですか?
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()
は、2 つの集計テーブルから最も古い日付を選択します。この方法により、合計する前の結合に固有の乗算の問題が回避されます。
以上がMySQL でテーブルを結合するときに SUM の乗算結果を回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。