Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL select distinct ne fonctionne pas

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.