Det kaldes at vælge det gruppemæssige maksimum for en kolonne. Her er flere forskellige tilgange til mysql.
Sådan ville jeg gøre det:
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
Dette vil være relativt effektivt, selvom mysql vil oprette en midlertidig tabel i hukommelsen til underforespørgslen. Jeg antager, at du allerede har et indeks på (id, version_id) for denne tabel.
Det er en mangel i SQL, at du mere eller mindre skal bruge en underforespørgsel til denne type problemer ( semi-joins er et andet eksempel).
Underforespørgsler er ikke godt optimeret i mysql, men ukorrelerede underforespørgsler er ikke så dårlige, så længe de ikke er så enorme, at de bliver skrevet til disk i stedet for hukommelse. I betragtning af, at i denne forespørgsel kun har to ints, kunne underforespørgslen være millioner af rækker længe før det skete, men select *-underforespørgslen i din første forespørgsel kunne lide af dette problem meget hurtigere.