PostgreSQL LEFT JOIN: Unerwartete Multiplikation der Zeilenanzahl
Eine PostgreSQL 9.1-Abfrage mit mehreren LEFT JOINs vervielfachte unerwartet die Zeilenanzahl, anstatt sie beizubehalten. Ziel der Abfrage war es, Benutzer-IDs, Kontostände, die Anzahl der Lebensmittelbesuche und die Anzahl der Fischmarktbesuche abzurufen. Die fehlerhafte Abfrage führte zu falschen Zählungen und zeigte wiederholte Werte anstelle der tatsächlichen Zählungen.
Dieses Problem ergibt sich aus der von links nach rechts verlaufenden JOIN-Verarbeitungsreihenfolge von PostgreSQL. Nachfolgende JOINs replizieren Zeilen aus früheren Joins, was zu einer Zählinflation führt. Wenn es beispielsweise 3 Lebensmittelbesuche und 12 Fischmarktbesuche gab, zeigte das Ergebnis fälschlicherweise 12 Einträge für jeden an, statt der erwarteten 3 und 12.
Die Lösung besteht darin, die Besuchszahlen vor dem Beitritt vorab zu aggregieren. Dadurch wird das Problem der Zeilenmultiplikation vermieden. Die korrigierte Abfrage lautet:
<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 gibt die einzelnen Zählungen für Lebensmittel- und Fischmarktbesuche pro Benutzer korrekt zurück und löst so das Multiplikationsproblem. Wenn ein Benutzer beispielsweise drei Lebensmittelgeschäfte und vier Fischmarktbesuche hatte, spiegelt die Ausgabe dies genau wider und vermeidet die fehlerhafte Wiederholung, die in der ursprünglichen Abfrage aufgetreten ist.
Das obige ist der detaillierte Inhalt vonWarum vervielfacht meine PostgreSQL LEFT JOIN-Abfrage die Anzahl, anstatt sie beizubehalten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!