Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL - Steuern Sie, welche Zeile von einer Gruppe zurückgegeben wird von

Dies wird als Auswahl des gruppenweisen Maximums einer Spalte bezeichnet. Hier sind verschiedene Ansätze für mysql.

So würde ich es machen:

SELECT *
FROM (SELECT id, max(version_id) as version_id FROM table GROUP BY id) t1
INNER JOIN table t2 on t2.id=t1.id and t1.version_id=t2.version_id

Dies ist relativ effizient, obwohl mysql für die Unterabfrage eine temporäre Tabelle im Speicher erstellt. Ich nehme an, Sie haben bereits einen Index für (id, version_id) für diese Tabelle.

Es ist ein Mangel von SQL, dass Sie für diese Art von Problem mehr oder weniger eine Unterabfrage verwenden müssen (). Semi-Joins sind ein weiteres Beispiel).

Unterabfragen sind in MySQL nicht gut optimiert, aber unkorrelierte Unterabfragen sind nicht so schlimm, solange sie nicht so groß sind, dass sie auf die Festplatte und nicht in den Speicher geschrieben werden. Angesichts der Tatsache, dass diese Abfrage nur zwei Ints hat, könnte die Unterabfrage Millionen von Zeilen umfassen, lange bevor dies geschah, aber die select *-Unterabfrage in Ihrer ersten Abfrage könnte viel früher unter diesem Problem leiden.