312 votes

MySQL Commandez par un numéro, Null dernier

Actuellement, je fais un OrderBy très basique dans ma déclaration.

 SELECT * FROM tablename WHERE visible=1 ORDER BY position ASC, id DESC
 

Le problème est que les entrées NULL pour 'position' sont traitées comme 0. Par conséquent, toutes les entrées avec la position NULL apparaissent avant celles avec 1,2,3,4. par exemple:

 NULL, NULL, NULL, 1, 2, 3, 4
 

Y a-t-il un moyen de réaliser l'ordre suivant:

 1, 2, 3, 4, NULL, NULL, NULL.
 

625voto

user1052645 Points 1054

MySQL a une syntaxe non documentée pour trier les valeurs NULL en dernier. Placez un signe moins (-) avant le nom de la colonne et changez l’ASC en DESC:

 SELECT * FROM tablename WHERE visible=1 ORDER BY -position DESC, id DESC
 

Il s'agit essentiellement de l'inverse de position DESC plaçant les valeurs NULL en dernier, mais identiques à position ASC .

Une bonne référence est ici http://troels.arvin.dk/db/rdbms#select-order_by

347voto

d-_-b Points 2690

J'ai trouvé que c'était une bonne solution pour la plupart:

 SELECT * FROM table ORDER BY ISNULL(field), field ASC;
 

25voto

DrewM Points 1246

Quelque chose comme

 SELECT * FROM tablename where visible=1 ORDER BY COALESCE(position, 999999999) ASC, id DESC
 

Remplacez 999999999 par la valeur maximale du champ

4voto

Langdon Points 7731

Vous pouvez échanger des instances de NULL avec une valeur différente pour les trier en premier (comme 0 ou -1) ou en dernier (un grand nombre ou une lettre) ...

 SELECT field1, IF(field2 IS NULL, 9999, field2) as ordered_field2
  FROM tablename
 WHERE visible = 1
 ORDER BY ordered_field2 ASC, id DESC
 

0voto

defines Points 4618

Vous pouvez utiliser la fonction COALESCE pour vérifier si l'index de position est NULL et, si tel est le cas, remplacez-le par une valeur avec un classement plus élevé que n'importe quel nombre (tel qu'une lettre). Effectuez ce remplacement dans l'instruction ORDER BY pour qu'il affecte réellement le tri. Cela n'aura aucun effet sur les valeurs de colonne sélectionnées récupérées (cela devrait être fait dans l'instruction SELECT ).

 SELECT * FROM tablename WHERE visible=1 ORDER BY COALESCE(position,'Z') ASC, id DESC
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X