Heim >Datenbank >MySQL-Tutorial >Warum fehlen Zeilen in meinem Left Outer Join-Ergebnis?
Grundlegendes zu fehlenden Zeilen in Left Outer Joins
Ein Benutzer, der versuchte, die täglichen Seitenaufrufe zu berechnen, stieß auf eine häufige Falle beim Left-Outer-Join: fehlende Zeilen in der linken Tabelle. Die Abfrage zielte darauf ab, Daten aus day
- und tracking
-Tabellen mithilfe eines linken äußeren Joins zu kombinieren:
<code class="language-sql">SELECT day.days, COUNT(*) as opens FROM day LEFT OUTER JOIN tracking ON day.days = DAY(FROM_UNIXTIME(open_date)) WHERE tracking.open_id = 10 GROUP BY day.days</code>
Die day
-Tabelle enthielt Daten für die Tage 1–30, das Ergebnis zeigte jedoch nur die Tage 1 und 9. Diese Diskrepanz ergibt sich aus der Platzierung der WHERE
-Klausel.
Das Problem: Falsche Platzierung der WHERE-Klausel
Die WHERE tracking.open_id = 10
-Klausel filtert nach dem Join. Dies bedeutet, dass Zeilen entfernt werden, in denen tracking.open_id
nicht 10 ist, auch wenn diese Zeilen aus der linken Tabelle (day
) stammen. Ein linker äußerer Join ist so konzipiert, dass er alle Zeilen der linken Tabelle einbezieht, unabhängig von Übereinstimmungen in der rechten Tabelle. Die WHERE
-Klausel negiert dieses Verhalten effektiv.
Die Lösung: Integration des Filters in die JOIN-Bedingung
Um alle Tage korrekt aus der day
-Tabelle abzurufen, muss die Filterbedingung in die JOIN
-Bedingung selbst integriert werden:
<code class="language-sql">SELECT day.days, COUNT(*) as opens FROM day LEFT OUTER JOIN tracking ON day.days = DAY(FROM_UNIXTIME(open_date)) AND tracking.open_id = 10 GROUP BY day.days</code>
Durch das Verschieben von tracking.open_id = 10
in die ON
-Klausel erfolgt die Filterung bevor die Zeilen kombiniert werden. Dadurch wird sichergestellt, dass beim Join nur übereinstimmende Zeilen aus der Tabelle tracking
(wobei open_id = 10
) berücksichtigt werden, während dennoch alle Zeilen aus der Tabelle day
im Endergebnis erhalten bleiben. Dies spiegelt genau die Absicht eines linken äußeren Joins wider.
Das obige ist der detaillierte Inhalt vonWarum fehlen Zeilen in meinem Left Outer Join-Ergebnis?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!