Distinct on-Abfragen von Postgresql in MySQL übersetzen
Bei der Migration von Postgresql zu MySQL müssen häufig vorhandene Abfragen angepasst werden. Ein solcher Abfragetyp ist die DISTINCT ON-Abfrage, die unter Berücksichtigung mehrerer Spalten eindeutige Zeilen abruft. Obwohl MySQL kein exaktes Äquivalent hat, gibt es Ansätze, um eine ähnliche Funktionalität zu erreichen.
SELECT DISTINCT ON von Postgresql
Die SELECT DISTINCT ON-Abfrage von Postgresql ruft unterschiedliche Zeilen basierend auf angegebenen Spalten ab. Zum Beispiel:
SELECT DISTINCT ON (col1, col2, col3) col4, col5 FROM tablename
Diese Abfrage gibt nur eine Zeile für jede eindeutige Kombination von (col1, col2, col3) zurück und behält die zuerst gefundenen Werte für col4 und col5 bei.
MySQL Group By-Erweiterung
MySQL erweitert die GROUP BY-Klausel, um die Auswahl nicht aggregierter Spalten zu ermöglichen. Die für jede Gruppe zurückgegebene spezifische Zeile ist jedoch unbestimmt. Dies bedeutet, dass eine Abfrage wie:
SELECT col4, col5 FROM tablename GROUP BY col1, col2, col3
hinsichtlich der Zeilenauswahl der DISTINCT ON-Abfrage von Postgresql entspricht. Die zurückgegebene Zeile ist jedoch nicht vorhersehbar.
Anpassung an MySQL
Um die Vorhersagbarkeit sicherzustellen, ist ein geordneter Ansatz erforderlich. Trotz der Verlockung, eine Unterabfrage mit ORDER BY zu verwenden, respektiert der MySQL-Optimierer dies möglicherweise nicht.
Ein zuverlässigerer Ansatz ist:
SELECT t1.col4, t1.col5 FROM tablename t1 INNER JOIN ( SELECT col1, col2, col3, MIN(col4) as m_col4 FROM tablename GROUP BY col1, col2, col3 ) s ON t1.col1=s.col1 AND t1.col2=s.col2 AND t1.col3=s.col3 AND t1.col4=s.m_col4 GROUP BY t1.col1, t1.col2, t1.col3, t1.col4
Diese Abfrage findet die erste gefundene Zeile, die DISTINCT ON erfüllt Kriterien in Postgresql durch Verwendung einer korrelierten Unterabfrage, um den minimalen col4-Wert für jede Gruppe abzurufen.
Schlussfolgerung
Während die DISTINCT ON-Abfrage von Postgresql kein direktes Gegenstück in MySQL hat , es gibt Problemumgehungen. Die Wahl des Ansatzes hängt von der konkreten Anfrage und dem gewünschten Komplexitätsgrad ab.
Das obige ist der detaillierte Inhalt vonWie erreicht man die Funktionalität von Postgresqls DISTINCT ON in MySQL?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!