Vì ORDER BY id DESC
mệnh đề, truy vấn được xử lý thay vì như thể nó được viết:
SELECT DISTINCT name, id
FROM table
ORDER BY id DESC;
ngoại trừ id
các cột không được trả lại cho người dùng (bạn). Tập hợp kết quả phải bao gồm id
để có thể đặt hàng bởi nó. Rõ ràng, tập kết quả này có bốn hàng, vì vậy đó là những gì được trả về. (Đạo đức:không sắp xếp theo các cột ẩn - trừ khi bạn biết nó sẽ làm gì với truy vấn của mình.)
Hãy thử:
SELECT DISTINCT name
FROM table
ORDER BY name;
(có hoặc không có DESC theo ý thích). Điều đó sẽ chỉ trả về hai hàng.
Nếu bạn cần biết một id
đối với mỗi tên, hãy xem xét:
SELECT name, MIN(id)
FROM table
GROUP BY name
ORDER BY MIN(id) DESC;
Bạn có thể sử dụng MAX để có hiệu quả tốt như nhau.
Tất cả điều này áp dụng cho tất cả các cơ sở dữ liệu SQL, bao gồm cả MySQL. MySQL có một số quy tắc cho phép bạn bỏ qua các mệnh đề GROUP BY có kết quả hơi không xác định. Tôi khuyên bạn không nên khai thác tính năng này.
Trong một thời gian dài (thậm chí có thể là bây giờ) tiêu chuẩn SQL không cho phép bạn sắp xếp thứ tự theo các cột không có trong danh sách chọn, chính xác là để tránh nhầm lẫn như thế này. Khi tập kết quả không bao gồm dữ liệu sắp xếp thứ tự, thứ tự của tập kết quả được gọi là 'thứ tự thiết yếu'; nếu tất cả các cột sắp xếp đều xuất hiện trong tập kết quả, thì đó là 'thứ tự không cần thiết' vì bạn có đủ dữ liệu để tự sắp xếp dữ liệu.