Heim >Datenbank >MySQL-Tutorial >Warum fehlen Zeilen in meinem Left Outer Join-Ergebnis?

Warum fehlen Zeilen in meinem Left Outer Join-Ergebnis?

Linda Hamilton
Linda HamiltonOriginal
2025-01-23 16:13:13962Durchsuche

Why are Rows Missing from My Left Outer Join Result?

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!

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