Vermeidung multiplizierter SUM-Ergebnisse in MySQL-Joins
MySQL-Joins führen in Kombination mit SUM-Aggregationen aufgrund des kartesischen Produkteffekts häufig zu ungenauen, überhöhten Ergebnissen. Mehrere Verknüpfungen können zu Zeilenduplizierungen führen und die SUM-Werte erhöhen. Die Lösung besteht darin, Daten mithilfe von Unterabfragen vorab zu aggregieren.
Effektive Strategie: Unterabfragen für genaue Aggregation
Um überhöhte SUM-Werte zu vermeiden, führen Sie die Aggregationen vor den Tabellenverknüpfungen durch. Dies wird durch Unterabfragen erreicht, die Daten unabhängig voneinander gruppieren und summieren und dann die aggregierten Ergebnisse zusammenführen.
Abfragebeispiel und Erklärung:
Diese Abfrage zeigt, wie Tabellen bei Verwendung von SUM-Aggregationen korrekt verknüpft werden:
<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>
Die Unterabfragen (m
und t
) berechnen unabhängig voneinander die Summen für drive_time
bzw. tm_hours
und gruppieren nach ds_id
und week
. Diese aggregierten Ergebnisse werden dann mit bhds_teachers
(alias i
) unter Verwendung der ds_id
und passenden week
-Zahlen verknüpft. LEAST()
wählt das früheste Datum aus den beiden aggregierten Tabellen aus. Diese Methode vermeidet das Multiplikationsproblem, das mit dem Verbinden vor dem Summieren verbunden ist.
Das obige ist der detaillierte Inhalt vonWie kann ich multiplizierte SUM-Ergebnisse beim Verknüpfen von Tabellen in MySQL vermeiden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!