Heim >Datenbank >MySQL-Tutorial >Warum gibt mein linker äußerer Join nur zwei statt dreißig Zeilen zurück?

Warum gibt mein linker äußerer Join nur zwei statt dreißig Zeilen zurück?

Susan Sarandon
Susan SarandonOriginal
2025-01-23 16:02:11921Durchsuche

Why Does My Left Outer Join Only Return Two Rows Instead of Thirty?

Fehlerbehebung bei einem Left Outer Join: Warum nur zwei Zeilen zurückgegeben wurden

Ein Benutzer hat versucht, tägliche Seitenaufrufe mithilfe eines linken äußeren Joins zu zählen, aber die Abfrage hat unerwartet nur zwei Zeilen statt der erwarteten dreißig zurückgegeben. Lassen Sie uns die problematische Abfrage und ihre Lösung untersuchen.

Die ursprüngliche Abfrage:

<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>

Das Problem: WHERE-Klausel nach dem JOIN

Das Problem liegt in der WHERE tracking.open_id = 10-Klausel. Diese Bedingung wird nach dem linken äußeren Join angewendet. Ein linker äußerer Join soll alle Zeilen aus der linken Tabelle (day) einbeziehen, auch wenn es in der rechten Tabelle (tracking) keine Übereinstimmung gibt. Allerdings filtert die WHERE-Klausel effektiv alle Zeilen heraus, in denen tracking.open_id nicht 10 ist, und eliminiert so Zeilen aus der day-Tabelle, denen ein entsprechender Eintrag in tracking mit open_id = 10.

fehlt

Die Lösung: Die Bedingung in den JOIN integrieren

Um alle dreißig Zeilen aus der Tabelle day abzurufen, muss die Filterbedingung Teil der Join-Bedingung selbst sein. Dies wird mit AND:

erreicht
<code class="language-sql">SELECT day.days, COUNT(tracking.open_id) 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>

Beachten Sie die Änderung an COUNT(tracking.open_id): Dadurch wird sichergestellt, dass Tage ohne übereinstimmende Einträge in tracking mit 0 und nicht mit NULL gezählt werden, was bei einigen Datenbanksystemen zu Problemen führen würde. Diese korrigierte Abfrage führt korrekt einen Left-Outer-Join durch und gibt die erwarteten dreißig Zeilen zurück, die die täglichen Seitenöffnungen genau darstellen.

Das obige ist der detaillierte Inhalt vonWarum gibt mein linker äußerer Join nur zwei statt dreißig Zeilen zurück?. 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