Nazywa się to wybieraniem grupowego maksimum kolumny. Oto kilka różnych podejść do mysql.
Oto jak bym to zrobił:
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
Będzie to stosunkowo wydajne, chociaż mysql utworzy w pamięci tabelę tymczasową dla podzapytania. Zakładam, że masz już indeks (id, version_id) dla tej tabeli.
Wadą SQL jest to, że w przypadku tego typu problemu trzeba mniej więcej użyć podzapytania ( półłączenia są kolejnym przykładem).
Podzapytania nie są dobrze zoptymalizowane w mysql, ale nieskorelowane podzapytania nie są tak złe, o ile nie są tak ogromne, że zostaną zapisane na dysku, a nie w pamięci. Biorąc pod uwagę, że w tym zapytaniu są tylko dwa inty, podzapytanie może mieć miliony wierszy na długo przed tym, ale podzapytanie select * w pierwszym zapytaniu może ucierpieć z powodu tego problemu znacznie wcześniej.