Debuggen von SQL LEFT JOINs: Genaue Besuchszahlen
Ein häufiges Problem entsteht, wenn mehrere LEFT JOIN
s in SQL verwendet werden, um Besuche über verschiedene Tabellen hinweg zu zählen. In diesem Beispiel werden drei Tabellen verwendet: users
, grocery
und fishmarket
. Eine Abfrage, die darauf ausgelegt ist, die Besuche jedes Benutzers sowohl in Lebensmittelgeschäften als auch in Fischmärkten zu zählen, führt zu ungenauen Ergebnissen.
Das Problem ergibt sich aus der sequentiellen Natur der Verknüpfungen. Ein naiver Ansatz verbindet zunächst users
und grocery
und erstellt eine Zeile für jeden Benutzer mit einem account_balance
ungleich Null und seinen Lebensmittelbesuchen. Die anschließende Verknüpfung mit fishmarket
multipliziert dann fälschlicherweise die Anzahl der Lebensmittelbesuche mit der Anzahl der Fischmarktbesuche für jeden Benutzer. Dies führt zu überhöhten Besuchszahlen.
Die Lösung besteht darin, die Abfrage so umzustrukturieren, dass Besuchszahlen zusammengefasst werden, bevor sie der Tabelle users
hinzugefügt werden. Dies wird mithilfe zweier korrelierter Unterabfragen effizient erreicht. Jede Unterabfrage zählt unabhängig voneinander Besuche für die Tabelle grocery
oder fishmarket
und gruppiert sie nach user_id
. Diese aggregierten Zählungen werden dann mit der users
-Tabelle zusammengeführt, um genaue Besuchsgesamtzahlen sicherzustellen.
Hier ist die korrigierte Abfrage mithilfe von Unterabfragen:
<code class="language-sql">SELECT u.id, u.account_balance, g.grocery_visits, f.fishmarket_visits FROM users u LEFT JOIN ( SELECT user_id, COUNT(*) AS grocery_visits FROM grocery GROUP BY user_id ) g ON g.user_id = u.id LEFT JOIN ( SELECT user_id, COUNT(*) AS fishmarket_visits FROM fishmarket GROUP BY user_id ) f ON f.user_id = u.id ORDER BY u.id;</code>
Diese überarbeitete Abfrage liefert genaue, unabhängige Zählungen der Lebensmittel- und Fischmarktbesuche für jeden Benutzer und behebt den Multiplikationsfehler der ursprünglichen Abfrage.
Das obige ist der detaillierte Inhalt vonWarum geben meine beiden SQL-LEFT-JOINS falsche Besuchszahlen zurück?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!