Heim >Datenbank >MySQL-Tutorial >Warum schlägt meine MySQL-GROUP-BY-Abfrage in PostgreSQL fehl?

Warum schlägt meine MySQL-GROUP-BY-Abfrage in PostgreSQL fehl?

Barbara Streisand
Barbara StreisandOriginal
2025-01-11 07:36:43158Durchsuche

Why Does My MySQL GROUP BY Query Fail in PostgreSQL?

PostgreSQL und MySQL: Ein Vergleich von GROUP BY-Klauseln

Die Migration von MySQL-Abfragen zu PostgreSQL kann zu dem Fehler „Spalte ‚XYZ‘ muss in der GROUP BY-Klausel erscheinen oder in einer Aggregatfunktion verwendet werden“ führen. Diese Diskrepanz ergibt sich aus der Art und Weise, wie diese Datenbanken mit GROUP BY-Klauseln umgehen.

MySQLs nicht-standardisierter Ansatz

MySQLs GROUP BY Implementierung weicht vom SQL-Standard ab. Es ermöglicht die Auswahl von Spalten, die nicht explizit in der GROUP BY-Klausel aufgeführt sind, was zu einer unvorhersehbaren Ausgabe führt. Die ausgewählte Zeile aus jeder Gruppe wird implizit bestimmt und durch Faktoren wie Indizierung und Abfrageoptimierung beeinflusst.

Standardkompatibel mit PostgreSQL GROUP BY

PostgreSQL hält sich jedoch strikt an den SQL-Standard. Alle Spalten in der SELECT-Liste müssen entweder in der GROUP BY-Klausel enthalten sein oder Teil einer Aggregatfunktion sein (wie SUM, AVG, COUNT). Andernfalls tritt der oben genannte Fehler auf.

Replikation des MySQL-Verhaltens in PostgreSQL

Während der Ansatz von PostgreSQL vorhersehbarer und standardkonformer ist, können Sie das nicht standardmäßige Verhalten von MySQL mit DISTINCT ON simulieren. Die folgende PostgreSQL-Abfrage zeigt dies:

<code class="language-sql">SELECT DISTINCT ON (availables.bookdate)
availables.*,
rooms.hotel_id
FROM availables
INNER JOIN rooms ON rooms.id = availables.room_id
WHERE rooms.hotel_id = 5056
AND availables.bookdate BETWEEN '2009-11-22' AND '2009-11-24'
ORDER BY availables.updated_at;</code>

DISTINCT ON gibt eine einzelne Zeile für jeden einzelnen Wert in availables.bookdate zurück und behält dabei die durch die ORDER BY-Klausel angegebene Zeilenreihenfolge bei. Dadurch wird das nicht standardmäßige GROUP BY-Verhalten von MySQL in diesem speziellen Szenario effektiv nachgeahmt. Beachten Sie, dass dieser Ansatz auf der ORDER BY-Klausel basiert, um zu definieren, welche Zeile für jede bestimmte Gruppe ausgewählt wird.

Das obige ist der detaillierte Inhalt vonWarum schlägt meine MySQL-GROUP-BY-Abfrage in PostgreSQL fehl?. 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