Říká se tomu výběr skupinového maxima sloupce. Zde je několik různých přístupů pro mysql.
Zde je návod, jak bych to udělal:
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
To bude relativně efektivní, ačkoli mysql vytvoří dočasnou tabulku v paměti pro poddotaz. Předpokládám, že pro tuto tabulku již máte index na (id, version_id).
Nedostatkem SQL je, že pro tento typ problému musíte víceméně použít poddotaz ( poloviční spojení jsou dalším příkladem).
Poddotazy nejsou v mysql dobře optimalizovány, ale nekorelované poddotazy nejsou tak špatné, pokud nejsou tak obrovské, že se budou zapisovat na disk, nikoli do paměti. Vzhledem k tomu, že v tomto dotazu jsou pouze dva int, poddotaz mohl mít miliony řádků dlouho předtím, než k tomu došlo, ale poddotaz select * ve vašem prvním dotazu by mohl trpět tímto problémem mnohem dříve.