På grund af ORDER BY id DESC
klausul, behandles forespørgslen snarere, som om den var skrevet:
SELECT DISTINCT name, id
FROM table
ORDER BY id DESC;
bortset fra at id
kolonner returneres ikke til brugeren (dig). Resultatsættet skal inkludere id
at kunne bestille efter det. Dette resultatsæt har naturligvis fire rækker, så det er det, der returneres. (Moral:sorter ikke efter skjulte kolonner - medmindre du ved, hvad det vil gøre ved din forespørgsel.)
Prøv:
SELECT DISTINCT name
FROM table
ORDER BY name;
(med eller uden DESC alt efter indfald). Det vil kun returnere de to rækker.
Hvis du har brug for at kende et id
For hvert navn skal du overveje:
SELECT name, MIN(id)
FROM table
GROUP BY name
ORDER BY MIN(id) DESC;
Du kan bruge MAX til lige så god effekt.
Alt dette gælder for alle SQL-databaser, inklusive MySQL. MySQL har nogle regler, som giver dig mulighed for at udelade GROUP BY-klausuler med noget ikke-deterministiske resultater. Jeg fraråder at udnytte funktionen.
I lang tid (måske endda nu) tillod SQL-standarden dig ikke at sortere efter kolonner, der ikke var i select-listen, netop for at undgå forvekslinger som denne. Når resultatsættet ikke inkluderer bestillingsdata, kaldes rækkefølgen af resultatsættet 'essentiel bestilling'; hvis bestillingskolonnerne alle vises i resultatsættet, er det 'essentiel bestilling', fordi du har nok data til selv at bestille dataene.