Ini disebut memilih kolom maksimum berdasarkan grup. Berikut adalah beberapa pendekatan berbeda untuk mysql.
Begini cara saya melakukannya:
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
Ini akan relatif efisien, meskipun mysql akan membuat tabel sementara di memori untuk subquery. Saya berasumsi Anda sudah memiliki indeks di (id, version_id) untuk tabel ini.
Ini adalah kekurangan dalam SQL sehingga Anda kurang lebih harus menggunakan subquery untuk jenis masalah ini ( semi-gabung adalah contoh lain).
Subquery tidak dioptimalkan dengan baik di mysql tetapi subquery yang tidak berkorelasi tidak terlalu buruk selama mereka tidak terlalu besar sehingga akan ditulis ke disk daripada memori. Mengingat bahwa dalam kueri ini hanya memiliki dua int, subkueri dapat menjadi jutaan baris jauh sebelum hal itu terjadi, tetapi subkueri pilih * dalam kueri pertama Anda dapat mengalami masalah ini lebih cepat.