Heim >Datenbank >MySQL-Tutorial >Wie kann ich multiplizierte SUM-Ergebnisse beim Verknüpfen von Tabellen in MySQL vermeiden?

Wie kann ich multiplizierte SUM-Ergebnisse beim Verknüpfen von Tabellen in MySQL vermeiden?

Linda Hamilton
Linda HamiltonOriginal
2025-01-19 14:32:091010Durchsuche

How Can I Avoid Multiplied SUM Results When Joining Tables in MySQL?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn