Heim > Datenbank > MySQL-Tutorial > Wie migriere ich MySQL GROUP BY-Abfragen korrekt nach PostgreSQL?

Wie migriere ich MySQL GROUP BY-Abfragen korrekt nach PostgreSQL?

Patricia Arquette
Freigeben: 2025-01-11 08:26:40
Original
653 Leute haben es durchsucht

How to Migrate MySQL GROUP BY Queries to PostgreSQL Correctly?

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

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

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

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!

Quelle:php.cn
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