web-dev-qa-db-fra.com

Comment commander 1,2,3 pas 1, 10, 11, 12 dans MySQL

Le code suivant est affiché dans l'ordre suivant: 1, 10, 11, 12 de l'id.

Je veux le faire 1,2,3,4 ...

Quelqu'un pourrait-il me dire ce que je devrais faire s'il vous plaît?.

$Q = $this->db->query('SELECT P.*, C.Name AS CatName FROM products AS P LEFT JOIN categories C ON C.id = P.category_id');

Merci d'avance.

27
shin

Premièrement, ajoutez une clause order by à la fin:

ORDER BY category_id

Si category_id est une chaîne, vous devez la traiter comme un entier. Il y a quelques façons de le faire. J'ajoute généralement un zéro. Vous pouvez aussi le lancer.

ORDER BY category_id + 0
57
Scott Saunders

Vous pouvez faire un casting explicite en faisant:

ORDER BY CAST (category_id COMME INTEGRE NON DESIGNÉ)

Cependant, vous devez reconsidérer la structure de votre base de données, car un champ contenant uniquement des valeurs numériques doit également être de type numérique.

Meilleurs voeux, Fabian

10
halfdan

Comme mentionné précédemment, MySQL ne prend pas en charge le tri alphanumérique. Un truc commun pour résoudre ce problème est de commencer par ordre de longueur:

ORDER BY LENGTH(column_name), column_name

Tant que la partie non numérique de la valeur a la même longueur, cela triera 1 avant 10, 10 avant 100, etc.

8
Andreas Bergström

Assurez-vous que la colonne qui contient 1, 2, 3, 4 est de type INT; si c'est TEXT, vous n'obtiendrez pas un ordre numérique, mais ce que vous décrivez 1, 10, 11, 2, 22, 23, 31, etc.

Et comme d'autres mentionnés, utilisez ORDER BY

6
Jakub

Order by ne fonctionne que pour les valeurs numériques ( int ), ne fonctionne pas pour varchar, char

Votre category_id doit être numérique, sinon vous devez transtyper les valeurs en numérique.

0
CHanaka