2011-01-04 4 views
0

J'ai quelques ensembles de nombres que je suis en train de motMySQL Tri question numéro

4.13.1.5, 4.13.1, 4.10.5, 4.9.97 

Mais quand je l'utilise pour MySQL en fonction d'une certaine manière, il trie dans une étrange façon.

4.13.1.5, 4.13.1, 4.9.37, 4.10.5 

Est-ce que c'est 4.9 qui vient à la fin? Est-ce que j'ai râté quelque chose?

+0

Pourriez-vous s'il vous plait publier votre requête? –

+0

Ce ne sont pas les mêmes (le premier a '4.9.97' et le second a '4.9.37'). Pourriez-vous afficher les chaînes exactes dont vous parlez? – ircmaxell

+0

Il n'y a pas de '4.9' dans vos données. Il y a '4.9.37' et cela devrait aller au début ou à la fin selon que' '.' trie avant ou après les chiffres. Dites-nous à quoi ressemble la requête et quel type de données vous utilisez pour les "nombres". – Oswald

Répondre

2

Étant donné que ces chaînes sont techniquement et pas des chiffres, MySQL fait la bonne chose. Le . (caractère 46) est plus élevé dans l'ordre de tri que n'importe lequel des nombres (caractères 48-59). Quand il s'agit de comparer la chaîne, il s'agit d'une valeur ASCII ne se décomposant pas en jetons et en comparant les nombres.

+0

Cela n'a aucun sens puisque tous les "nombres" ont les mêmes 2 premiers caractères. Il devrait donc trier sur le troisième + (1, 1, 9, 1 de l'ordre des résultats). Donc ça n'a vraiment pas de sens pourquoi le 9 serait en 2ème position ... (A moins que je ne loupe) ... – ircmaxell

0

Works pour moi:

mysql> create table test (value varchar(10)); 
Query OK, 0 rows affected (0.18 sec) 


mysql> insert into test values ("4.13.1.5"), ("4.13.1"), ("4.10.5"), ("4.9.97") 
    -> ; 
Query OK, 4 rows affected (0.00 sec) 
Records: 4 Duplicates: 0 Warnings: 0 

mysql> select value from test order by value; 
+----------+ 
| value | 
+----------+ 
| 4.10.5 | 
| 4.13.1 | 
| 4.13.1.5 | 
| 4.9.97 | 
+----------+ 
4 rows in set (0.00 sec) 

+0

Pourquoi 4,10 arrive-t-il au sommet? Ne devrait pas 4.13 venir en haut – Chirag

+1

La comparaison n'est pas numérique (ce sont des chaînes, et 0 vient avant 3). – krakover