Het heet het selecteren van het groepsgewijze maximum van een kolom. Hier zijn verschillende benaderingen voor mysql.
Hier is hoe ik het zou doen:
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
Dit zal relatief efficiënt zijn, hoewel mysql een tijdelijke tabel in het geheugen voor de subquery zal creëren. Ik neem aan dat je al een index hebt op (id, version_id) voor deze tabel.
Het is een tekortkoming in SQL dat je min of meer een subquery moet gebruiken voor dit soort problemen ( semi-joins zijn een ander voorbeeld).
Subquery's zijn niet goed geoptimaliseerd in mysql, maar niet-gecorreleerde subquery's zijn niet zo slecht zolang ze niet zo enorm zijn dat ze naar schijf worden geschreven in plaats van naar het geheugen. Aangezien deze query maar twee ints heeft, kan de subquery miljoenen rijen zijn lang voordat dat gebeurde, maar de select * subquery in uw eerste query zou veel eerder met dit probleem te maken kunnen krijgen.