これは、列のグループごとの最大値の選択と呼ばれます。 mysqlのさまざまなアプローチがあります。
これが私がそれをする方法です:
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
これは比較的効率的ですが、mysqlはサブクエリ用にメモリ内に一時テーブルを作成します。このテーブルの(id、version_id)にすでにインデックスがあると思います。
このタイプの問題に対して多かれ少なかれサブクエリを使用する必要があるのはSQLの欠陥です(半結合 別の例です。
サブクエリはmysqlで十分に最適化されていませんが、無相関のサブクエリは、メモリではなくディスクに書き込まれるほど大きくない限り、それほど悪くはありません。このクエリには2つのintしかないため、サブクエリはそれが発生するずっと前に数百万行になる可能性がありますが、最初のクエリのselect*サブクエリはこの問題をはるかに早く受ける可能性があります。