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
.
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
:
<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!