2010-07-01 9 views
6

Comment passez-vous commande par numéro si votre nombre peut tomber en dessous et être plus grand que 0?Mysql sélectionnez ordre en agissant comme une chaîne, pas un numéro

Exemple de table Mysql:

|Name|Karma| 
__________ 
|Me | -8 | 
|Bill| 5 | 
|Tom | 2 | 
|Saly| 0 | 
|San.| -3 | 

Exemple requête de sélection

$sql="SELECT karma FROM table ORDER BY karma DESC"; 

Le résultat que je reçois est ce (séparés par des virgules): 5,2,0, -8, -3. Ce ne devrait pas être 5,2,0, -3, -8? J'ai découvert quelque part sur internet que mysql commande par chaîne. Comment le faire commander par numéro?

+1

Bienvenue sur SO. S'il vous plaît, lorsque vous posez des questions sur la base de données, spécifiez toujours les types de colonnes. –

Répondre

17

Karma sera ordonnée comme une chaîne si vous en avez fait une chaîne, c'est-à-dire une colonne varchar.

Convertissez la colonne en INT, et elle sera classée numériquement.

Vous avez également la possibilité de ne pas changer la table, mais la coulée de la colonne dans le bon type lors du tri:

SELECT karma FROM table ORDER BY CAST(karma AS int) DESC 

mais ce qui est mauvais pour la performance.

+0

Hm, je pensais que varchar ferait l'affaire, mais j'avais tort. Merci! – Aistis

+3

La façon correcte est de stocker cette valeur est un INT, pas un VARCHAR, utilisé une valeur signée, de cette façon vous pouvez faire des négatifs. Cela améliorera vos performances et vous pouvez ajouter | substract à la colonne sans que votre code PHP ne connaisse la valeur, ce qui est une autre amélioration des performances. – TravisO

14

Il y a une autre option la plus bizarre:

SELECT karma FROM table ORDER BY karma+0 DESC 
+0

Bien! Je ne savais pas que mySQL l'a fait. Pourtant, c'est un casting implicite et pas bon pour la performance. –

+0

@ ne5tebio Hackable? Vous voulez dire de l'extérieur? Je ne pense pas. Comment cela fonctionnerait-il? –

+0

Est-ce plus rapide que de lancer un INT? – chiborg