Heim > Datenbank > MySQL-Tutorial > Warum gibt mein linker äußerer Join nicht alle Zeilen aus der linken Tabelle zurück?

Warum gibt mein linker äußerer Join nicht alle Zeilen aus der linken Tabelle zurück?

Patricia Arquette
Freigeben: 2025-01-23 15:51:10
Original
617 Leute haben es durchsucht

Why Doesn't My Left Outer Join Return All Rows from the Left Table?

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage