Left Outer Joins: Sicherstellung des vollständigen Datenabrufs aus der linken Tabelle
Ein häufiges Missverständnis bei Left Outer Joins besteht darin, dass sie immer alle Zeilen aus der linken Tabelle zurückgeben. Das ist nicht immer wahr; Zeilen aus der linken Tabelle werden weggelassen, wenn in der rechten Tabelle basierend auf der Join-Bedingung keine passenden Zeilen vorhanden sind.
Lassen Sie uns dies anhand eines Beispiels veranschaulichen. Stellen Sie sich eine Abfrage vor, die darauf ausgelegt ist, die täglichen Seitenaufrufe für einen bestimmten Benutzer (open_id) zu zählen:
<code class="language-sql">SELECT day.days, COUNT(*) AS views FROM day LEFT OUTER JOIN tracking ON day.days = DAY(FROM_UNIXTIME(open_date)) WHERE tracking.open_id = 10 GROUP BY day.days</code>
Diese Abfrage soll alle Tage und die zugehörigen Aufrufzahlen anzeigen. Wenn day
jedoch Einträge für jeden Tag des Monats enthält, tracking
jedoch für einige Tage für open_id = 10
keine Einträge enthält, fehlen diese Tage in den Ergebnissen.
Die Lösung liegt darin, die WHERE
-Klauselbedingung in die ON
-Klausel des Joins zu integrieren:
<code class="language-sql">SELECT day.days, COUNT(tracking.open_date) AS views 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 wird die Bedingung Teil des Joins selbst und nicht eines Post-Join-Filters. Dadurch wird sichergestellt, dass alle Zeilen aus der Tabelle day
enthalten sind, wobei views
für Tage ohne übereinstimmende Einträge in der Tabelle tracking
0 anzeigt. Beachten Sie die Verwendung von COUNT(tracking.open_date)
anstelle von COUNT(*)
, um die Anzahl der Aufrufe genau wiederzugeben. COUNT(*)
würde die Tage auch dann zählen, wenn es in der rechten Tabelle keine passenden Zeilen gäbe.
Das obige ist der detaillierte Inhalt vonWarum gibt mein linker äußerer Join nicht alle Zeilen aus der linken Tabelle zurück?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!