Heim  >  Artikel  >  Datenbank  >  Wie erreicht man die Funktionalität von Postgresqls DISTINCT ON in MySQL?

Wie erreicht man die Funktionalität von Postgresqls DISTINCT ON in MySQL?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-10 22:56:03164Durchsuche

How to Achieve the Functionality of Postgresql's DISTINCT ON in MySQL?

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!

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