Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL select distinto non funziona

A causa del ORDER BY id DESC clausola, la query viene trattata piuttosto come se fosse stata scritta:

SELECT DISTINCT name, id
  FROM table
 ORDER BY id DESC;

tranne che l'id le colonne non vengono restituite all'utente (tu). Il set di risultati deve includere l'id per poter ordinare da esso. Ovviamente, questo set di risultati ha quattro righe, quindi questo è ciò che viene restituito. (Morale:non ordinare per colonne nascoste, a meno che tu non sappia cosa farà alla tua richiesta.)

Prova:

SELECT DISTINCT name
  FROM table
 ORDER BY name;

(con o senza DESC a seconda del capriccio). Ciò restituirà solo le due righe.

Se hai bisogno di conoscere un id per ogni nome, considera:

SELECT name, MIN(id)
  FROM table
 GROUP BY name
 ORDER BY MIN(id) DESC;

Potresti usare MAX con un effetto altrettanto buono.

Tutto questo si applica a tutti i database SQL, incluso MySQL. MySQL ha alcune regole che consentono di omettere le clausole GROUP BY con risultati alquanto non deterministici. Sconsiglio di sfruttare la funzione.

Per molto tempo (forse anche adesso) lo standard SQL non permetteva di ordinare per colonne che non erano nella select-list, proprio per evitare confusioni come questa. Quando il set di risultati non include i dati di ordinamento, l'ordinamento del set di risultati è chiamato "ordinamento essenziale"; se le colonne di ordinamento vengono visualizzate tutte nel set di risultati, si tratta di un "ordinamento non essenziale" perché disponi di dati sufficienti per ordinare i dati da solo.