Nó được gọi là chọn cột tối đa theo nhóm khôn ngoan. Dưới đây là một số cách tiếp cận khác nhau cho mysql.
Đây là cách tôi sẽ làm điều đó:
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
Điều này sẽ tương đối hiệu quả, mặc dù mysql sẽ tạo một bảng tạm thời trong bộ nhớ cho truy vấn con. Tôi giả sử bạn đã có một chỉ mục trên (id, version_id) cho bảng này.
Sự thiếu sót trong SQL khiến bạn ít nhiều phải sử dụng truy vấn con cho loại sự cố này ( bán tham gia là một ví dụ khác).
Các truy vấn con không được tối ưu hóa tốt trong mysql nhưng các truy vấn con không liên quan không quá tệ miễn là chúng không quá lớn đến mức chúng sẽ được ghi vào đĩa thay vì bộ nhớ. Cho rằng trong truy vấn này chỉ có hai int, truy vấn con có thể dài hàng triệu hàng trước khi điều đó xảy ra nhưng truy vấn con select * trong truy vấn đầu tiên của bạn có thể gặp phải sự cố này sớm hơn nhiều.