Ze względu na ORDER BY id DESC
klauzula, zapytanie jest traktowane tak, jakby zostało napisane:
SELECT DISTINCT name, id
FROM table
ORDER BY id DESC;
z wyjątkiem tego, że id
kolumny nie są zwracane użytkownikowi (Tobie). Zestaw wyników musi zawierać id
aby móc przez to zamówić. Oczywiście ten zestaw wyników ma cztery wiersze, więc to jest zwracane. (Moralność:nie porządkuj według ukrytych kolumn — chyba że wiesz, co to zrobi z Twoim zapytaniem.)
Wypróbuj:
SELECT DISTINCT name
FROM table
ORDER BY name;
(z DESC lub bez DESC według kaprysu). To zwróci tylko dwa wiersze.
Jeśli potrzebujesz znać id
dla każdego imienia rozważ:
SELECT name, MIN(id)
FROM table
GROUP BY name
ORDER BY MIN(id) DESC;
Możesz użyć MAX do równie dobrego efektu.
Wszystko to dotyczy wszystkich baz danych SQL, w tym MySQL. MySQL ma kilka reguł, które pozwalają na pominięcie klauzul GROUP BY z nieco niedeterministycznymi wynikami. Odradzam wykorzystywanie tej funkcji.
Przez długi czas (może nawet teraz) standard SQL nie pozwalał na porządkowanie według kolumn, których nie było na liście wyboru, właśnie po to, by uniknąć takich pomyłek. Gdy zestaw wyników nie zawiera danych porządkowych, porządkowanie zestawu wyników nazywa się „podstawowym porządkowaniem”; jeśli wszystkie kolumny porządkowania pojawiają się w zestawie wyników, jest to „niezbędne porządkowanie”, ponieważ masz wystarczającą ilość danych, aby samodzielnie uporządkować dane.