A cause du ORDER BY id DESC
clause, la requête est plutôt traitée comme si elle était écrite :
SELECT DISTINCT name, id
FROM table
ORDER BY id DESC;
sauf que le id
les colonnes ne sont pas renvoyées à l'utilisateur (vous). Le jeu de résultats doit inclure le id
pour pouvoir commander par lui. De toute évidence, cet ensemble de résultats comporte quatre lignes, c'est donc ce qui est renvoyé. (Moralité :ne triez pas par colonnes masquées, à moins que vous ne sachiez ce que cela va faire de votre requête.)
Essayez :
SELECT DISTINCT name
FROM table
ORDER BY name;
(avec ou sans DESC selon l'envie). Cela ne renverra que les deux lignes.
Si vous avez besoin de connaître un id
pour chaque nom, considérez :
SELECT name, MIN(id)
FROM table
GROUP BY name
ORDER BY MIN(id) DESC;
Vous pouvez utiliser MAX pour un effet tout aussi efficace.
Tout cela s'applique à toutes les bases de données SQL, y compris MySQL. MySQL a des règles qui vous permettent d'omettre les clauses GROUP BY avec des résultats quelque peu non déterministes. Je déconseille d'exploiter cette fonctionnalité.
Pendant longtemps (peut-être même maintenant), la norme SQL ne vous permettait pas de trier par colonnes qui n'étaient pas dans la liste de sélection, précisément pour éviter de telles confusions. Lorsque le jeu de résultats n'inclut pas les données de classement, le classement du jeu de résultats est appelé « classement essentiel »; si les colonnes de tri apparaissent toutes dans le jeu de résultats, il s'agit d'un « tri non essentiel » car vous disposez de suffisamment de données pour trier les données vous-même.