Problème avec MySQL ORDER BY - puis-je utiliser natsort pour y remédier?
Question
Je dois utiliser le tri naturel avec un résultat MySQL car il trie actuellement mes valeurs INT comme suit:
- 1
- 123
- 1256
- 22
- 231
[etc]
Alors que je aurais besoin pour trier comme
- 1
- 22
- 231
- 1256
Je connais la fonction « natsort », mais il ne fonctionne pas pour un résultat de requête MySQL. Comment trier (naturellement), est-il possible de le faire dans la requête?
Merci pour l'aide!
EDIT: Exemple $result = mysql_query("SELECT * FROM forums ORDER BY 'posts' DESC;");
de requête
Pas tout à fait sûr que mon utilisation de DESC il est valable, mais il ne jette pas une erreur si elle doit être bien. Malheureusement, il semble changer à l'ASC DESC a aucun effet ...
La solution
La requête que vous avez posté il trie par une expression constante de chaîne plutôt que d'un nom de colonne ou la position. Soit utiliser pour citer des contre-apostrophes, ou prendre les citations:
SELECT * FROM forums ORDER BY `posts` DESC
ou peut-être
SELECT * FROM forums ORDER BY posts DESC
expliquerait pourquoi le changement entre les ASC et DESC n'a pas d'effet.
Première réponse:
L'ordre de tri que vous décrivez suggère les valeurs INT sont effectivement stockées sous la forme d'un type de caractères (ou peut-être converti caractère avant le tri).
Vérifiez si vous stockez les données dans un type numérique ou caractère. Si possible, utilisez un type numérique, l'ordre de tri naturel sera comme vous avez besoin. Si vous ne peut pas modifier le type de données sous-jacentes à l'INT, alors vous pouvez le faire dans votre requête (par exemple en utilisant CAST ), probablement au coût de la performance.
Autres conseils
Si les messages était une colonne non-INT, vous pouvez essayer ceci:
SELECT * FROM forums ORDER BY CAST(`posts` AS INT) DESC
Voir aussi http://drupal.org/project/natsort . Ceci est un module Drupal qui peut être utilisé pour faciliter le tri MySQL.
Cette question a une réponse pour MySQL que je l'ai utilisé.