Heim >Datenbank >MySQL-Tutorial >Warum schlägt meine MySQL-GROUP-BY-Abfrage in PostgreSQL fehl?
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!