Điều này có thể được đơn giản hóa thành như sau (ORDER BY
trong truy vấn con là vô ích):
SELECT *
FROM table
GROUP BY title
Tại sao bạn nghĩ rằng bạn cần JOIN
? (Được rồi, điều này đã được giải quyết bằng nhận xét).
Sau nhận xét của bạn rằng bạn cần cho mọi tiêu đề, hàng có dấu thời gian lớn nhất, điều này sẽ thực hiện công việc:
SELECT t.*
FROM
table AS t
JOIN
( SELECT title
, MAX(timestamp) AS maxts
FROM table
GROUP BY title
) AS grp
ON grp.title = t.title
AND grp.maxts = t.timestamp
ORDER BY t.timestamp DESC
Đối với bản ghi, truy vấn ban đầu của bạn:
SELECT *
FROM
( SELECT *
FROM table
ORDER BY timestamp DESC
) m
GROUP BY title
có thể hoạt động như mong đợi, nhưng: chỉ trong MySQL cho phép bạn sử dụng trong SELECT
liệt kê các trường không có trong GROUP BY
mệnh đề (hoặc phụ thuộc vào chúng), mà không có bất kỳ hàm tổng hợp nào trong chúng. Vì vậy, truy vấn trên sẽ trả về nhiều hơn hoặc ít ngẫu nhiên hơn hàng cho mọi tiêu đề. Trên thực tế, nó sẽ trả về hàng đầu tiên mà nó sẽ tìm thấy cho một tiêu đề. Vì vậy, lần đầu tiên chạy truy vấn con (yêu cầu theo timestamp DESC
) dẫn đến việc tìm thấy hàng đầu tiên có dấu thời gian lớn nhất.
Tuy nhiên, điều này chỉ xảy ra bởi vì (khi, nếu) trình tối ưu hóa không hiểu rằng truy vấn con là vô dụng. Bạn có thể thấy rằng truy vấn ban đầu của bạn chạy tốt khi một ngày bạn nâng cấp lên MySQL phiên bản 7.5 và truy vấn của bạn ngừng hoạt động như trước. (bởi vì trình tối ưu hóa đã thông minh hơn và đã dịch truy vấn của bạn thành một truy vấn đơn giản hơn mà không có lựa chọn phụ).
Bạn thậm chí có thể thấy truy vấn của mình ngừng hoạt động hoàn toàn và tạo ra lỗi nếu MySQL quyết định trong bản phát hành trong tương lai tuân theo các tiêu chuẩn SQL cho GROUP BY
truy vấn.