Vanwege de ORDER BY id DESC
clausule, wordt de query behandeld alsof deze is geschreven:
SELECT DISTINCT name, id
FROM table
ORDER BY id DESC;
behalve dat de id
kolommen worden niet teruggestuurd naar de gebruiker (u). De resultatenset moet de id
. bevatten erdoor te kunnen bestellen. Het is duidelijk dat deze resultatenset vier rijen heeft, dus dat is wat wordt geretourneerd. (Moraal:sorteer niet op verborgen kolommen - tenzij u weet wat het met uw zoekopdracht gaat doen.)
Probeer:
SELECT DISTINCT name
FROM table
ORDER BY name;
(met of zonder DESC naar gelang de bevlieging). Dat levert alleen de twee rijen op.
Als u een id
moet weten overweeg voor elke naam:
SELECT name, MIN(id)
FROM table
GROUP BY name
ORDER BY MIN(id) DESC;
Je zou MAX met een even goed effect kunnen gebruiken.
Dit alles is van toepassing op alle SQL-databases, inclusief MySQL. MySQL heeft enkele regels waarmee u GROUP BY-clausules kunt weglaten met enigszins niet-deterministische resultaten. Ik raad af om de functie te misbruiken.
Lange tijd (misschien zelfs nu) stond de SQL-standaard je niet toe om te ordenen op kolommen die niet in de selectielijst stonden, juist om verwarring als deze te voorkomen. Als de resultatenset geen bestelgegevens bevat, wordt de volgorde van de resultatenset 'essentiële volgorde' genoemd; als de bestelkolommen allemaal in de resultatenset verschijnen, is het 'niet-essentiële volgorde' omdat je genoeg gegevens hebt om de gegevens zelf te bestellen.