Heim > Datenbank > MySQL-Tutorial > Warum vervielfacht meine PostgreSQL LEFT JOIN-Abfrage die Anzahl, anstatt sie beizubehalten?

Warum vervielfacht meine PostgreSQL LEFT JOIN-Abfrage die Anzahl, anstatt sie beizubehalten?

Linda Hamilton
Freigeben: 2025-01-23 12:23:10
Original
419 Leute haben es durchsucht

Why Does My PostgreSQL LEFT JOIN Query Multiply Counts Instead of Preserving Them?

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>
Nach dem Login kopieren

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!

Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage