ホームページ >データベース >mysql チュートリアル >MySQL で集計関数を使用してテーブルを結合するときに SUM 値の乗算を回避するにはどうすればよいですか?
MySQL で集計関数を使用してテーブルを結合するときに SUM 値の乗算を回避するためのヒント
MySQL クエリで複数の結合操作を組み合わせる場合、SUM などの集計関数を使用すると、予期しない結果が生じる可能性があります。これは、結合テーブルの行デカルト積が合計結果を乗算し、結果が不正確になるためです。
最初に 2 つのクエリを使用して、異なるテーブルから SUM 値を取得する例があるとします。クエリ 1 は、特定の日付範囲における特定の従業員の合計運転時間を計算し、クエリ 2 は同じ期間における同じ従業員の合計労働時間を計算します。
これらのクエリを 1 つの結合クエリに結合しようとすると、合計が不正確になります。これは、JOIN 操作によって bhds_timecard
と bhds_mileage
テーブル行のデカルト積が作成されるためです。その結果、運転時間と作業時間の合計値に、各テーブル内の一致する行の数が乗算されます。
この問題を解決するには、テーブルを結合する前にサブクエリを使用して SUM 値を計算します。 SUM 演算を別のサブクエリに移動することで、デカルト積を回避し、正確な結果を得ることができます。
以下はサブクエリを使用して改良されたクエリです:
<code class="language-sql">SELECT last_name, first_name, DATE_FORMAT(LEAST(mil_date, tm_date), '%m/%d/%y') AS dates, total, 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 bhds_mileage.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 bhds_timecard.ds_id = 5 GROUP BY ds_id, week ) AS t ON t.ds_id = i.ds_id AND t.week = m.week;</code>
このクエリ内:
m
従業員 ID および週ごとにグループ化された合計運転時間を計算します。 t
従業員 ID および週ごとにグループ化された合計労働時間を計算します。 bhds_teachers
テーブルをサブクエリ m
および t
と結合します。 その結果、クエリは、SUM 値を掛け合わせるという問題を発生させることなく、従業員および指定された期間の姓、名、日付、合計労働時間、合計運転時間を取得します。
以上がMySQL で集計関数を使用してテーブルを結合するときに SUM 値の乗算を回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。