2014-07-23 4 views
1
SELECT * FROM `member` ORDER BY `posts` DESC LIMIT 5 

J'ai ce petit extrait, et il devrait juste trier la liste par la quantité de messages que l'utilisateur a par là.ORDER BY number_column DESC: pourquoi un plus petit nombre vient-il avant un plus grand?

Pour une raison quelconque, un utilisateur avec 4 messages vient avant un utilisateur avec 24 messages. Est-ce parce qu'il le fait seulement selon le premier chiffre? Comment puis-je réparer ça?

posts est une colonne varchar contenant des nombres.

J'ai 7 utilisateurs dans la base de données pour les tests, un avec 24 messages, un avec 21 messages, un avec 4 messages, et quatre avec 0 messages. Il trie 4> 24> 21> 0> 0.

+4

Est-ce que les messages sont numériques? Montrez-nous le ddl et des exemples de données! – Jens

+1

Est-ce que 'posts'' INTEGER'? – bishop

+0

Heh, @Jens merci. J'ai fait une erreur stupide et l'ai fait comme un texte dans la base de données, juste réparé. J'ai continué à dépasser le code et je n'arrivais pas à le comprendre. –

Répondre

1

Il semble que votre champ posts est une chaîne. Donc, essayez de le faire pour le trier comme un nombre entier.

ORDER BY CAST(posts AS INTEGER) DESC 

qui devrait être commandé correctement.

Bien sûr, comme l'a fait remarquer @Jens, vous pouvez être malin pour corriger la définition de colonne à la place.

+0

Merci. Juste une erreur stupide de ma part, l'erreur n'était pas dans le code, c'était dans la base de données. –

-2

S'il vous plaît essayez ceci, si votre champ est de type text.

SELECT * FROM `member` ORDER BY LENGTH(`posts`) DESC LIMIT 5 // it gives the length in bytes 

OU

SELECT * FROM `member` ORDER BY LENGTH(`posts`) DESC LIMIT 5 // it count multi-byte characters 
0

Est-ce que les messages sont nummériques? Si oui, le convertir en entier CAST(posts AS INTEGER)

+0

@TedMobsby J'ai ajouté mon commentaire comme réponse. N'hésitez pas à l'augmenter ou à l'accepter. – Jens

Questions connexes