Heim >Datenbank >MySQL-Tutorial >Wie migriere ich MySQL GROUP BY-Abfragen korrekt nach PostgreSQL?
Unterschiede zwischen der GROUP BY-Anweisung zwischen PostgreSQL und MySQL
Einführung
Bei der Migration von Abfragen von MySQL nach PostgreSQL treten häufig Fehler auf, wenn die GROUP BY-Klausel verwendet wird. Dieser Artikel befasst sich mit den Unterschieden zwischen GROUP BY in MySQL und PostgreSQL und bietet Möglichkeiten zur Behebung dieses Fehlers.
Fehler
Beim Ausführen der folgenden Abfrage in PostgreSQL:
<code class="language-sql">SELECT `availables`.* 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') GROUP BY availables.bookdate ORDER BY availables.updated_at</code>
PostgreSQL gibt möglicherweise den folgenden Fehler zurück:
<code>ERROR: column "availables.id" must appear in the GROUP BY clause or be used in an aggregate function</code>
Unterschied
In MySQL ermöglicht die GROUP BY-Klausel die Einbeziehung bestimmter nicht aggregierter Felder in Abfrageergebnisse. PostgreSQL folgt jedoch dem SQL-Standard und verlangt, dass alle nicht aggregierten Felder in einer GROUP BY-Klausel erscheinen oder in Aggregatfunktionen verwendet werden müssen.
Lösung: DISTINCT ON
Um das GROUP BY-Verhalten von MySQL in PostgreSQL zu simulieren, können wir den DISTINCT ON-Ausdruck verwenden. DISTINCT ON ermöglicht es uns, eine eindeutige Zeile pro Gruppe basierend auf der angegebenen Spalte auszuwählen. Im angegebenen Beispiel funktioniert die folgende Abfrage in PostgreSQL:
<code class="language-sql">SELECT DISTINCT ON (availables.bookdate) `availables`.* 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.bookdate, availables.updated_at</code>
Diese Abfrage gibt die te Zeile für jeden eindeutigen Wert von availables.bookdate zurück und simuliert so effektiv das GROUP BY-Verhalten von MySQL. Beachten Sie, dass wir zur Gewährleistung konsistenter Ergebnisse availables.updated_at
zur ORDER BY
-Klausel hinzugefügt haben, sodass DISTINCT ON
immer dieselbe Zeile auswählt. Ohne dies gibt DISTINCT ON
bei jeder Ausführung möglicherweise andere Zeilen zurück.
Das obige ist der detaillierte Inhalt vonWie migriere ich MySQL GROUP BY-Abfragen korrekt nach PostgreSQL?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!