Karena ORDER BY id DESC
klausa, kueri diperlakukan seolah-olah ditulis:
SELECT DISTINCT name, id
FROM table
ORDER BY id DESC;
kecuali id
kolom tidak dikembalikan ke pengguna (Anda). Kumpulan hasil harus menyertakan id
untuk dapat memesan dengan itu. Jelas, kumpulan hasil ini memiliki empat baris, jadi itulah yang dikembalikan. (Moral:jangan mengurutkan berdasarkan kolom tersembunyi — kecuali Anda tahu apa yang akan terjadi pada kueri Anda.)
Coba:
SELECT DISTINCT name
FROM table
ORDER BY name;
(dengan atau tanpa DESC sesuai keinginan). Itu akan mengembalikan hanya dua baris.
Jika Anda perlu mengetahui id
untuk setiap nama, pertimbangkan:
SELECT name, MIN(id)
FROM table
GROUP BY name
ORDER BY MIN(id) DESC;
Anda bisa menggunakan MAX untuk efek yang sama baiknya.
Semua ini berlaku untuk semua database SQL, termasuk MySQL. MySQL memiliki beberapa aturan yang memungkinkan Anda untuk menghilangkan klausa GROUP BY dengan hasil yang agak non-deterministik. Saya sarankan untuk tidak mengeksploitasi fitur ini.
Untuk waktu yang lama (mungkin bahkan sekarang) standar SQL tidak memungkinkan Anda untuk memesan berdasarkan kolom yang tidak ada dalam daftar pilih, justru untuk menghindari kebingungan seperti ini. Ketika kumpulan hasil tidak menyertakan data pengurutan, pengurutan kumpulan hasil disebut 'pengurutan esensial'; jika kolom pemesanan semua muncul di kumpulan hasil, itu adalah 'pengurutan tidak penting' karena Anda memiliki cukup data untuk memesan data sendiri.