Problème avec order by

Résolu/Fermé
livatill Messages postés 5 Date d'inscription mardi 22 juillet 2008 Statut Membre Dernière intervention 22 juillet 2008 - 22 juil. 2008 à 10:15
 nzo - 23 nov. 2009 à 07:41
Bonjour à tous,

j'ai un p'tit problème avec order by.
Je veux avoir un champ nombre qui est trier par ordre croissant.
Exemple :
je veux avoir comme résultat : 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13
mais lorsque j'utilise un order by, il me fait : 1, 10, 11, 12, 13, 2, 3, 4, 5, 6, 7, 8, 9
merci d'avance pour votre aide!

5 réponses

PeterPeterPeter Messages postés 202 Date d'inscription jeudi 17 juillet 2008 Statut Membre Dernière intervention 22 juin 2010 30
22 juil. 2008 à 10:18
Tu peux afficher la requête que tu fais, ça sera plus simple pour voir l'erreur :)
0
livatill Messages postés 5 Date d'inscription mardi 22 juillet 2008 Statut Membre Dernière intervention 22 juillet 2008
22 juil. 2008 à 13:17
Voici la requête : select count(idSms)nbrSMS, numTirage from sms_report group by numTirage order by numTirage.
La requête marche bien seulement il affiche les 10, 11, 12, avant 2. C'est le 1 qu'il regarde dans le order by.
Merci.
0
Frappe Misere Messages postés 2677 Date d'inscription vendredi 22 février 2008 Statut Membre Dernière intervention 10 août 2011 568
22 juil. 2008 à 10:27
tu es sur que le format de ton champs de donnée est bien "chiffre" ?
là il trie comme si c'etait du texte.
0
livatill Messages postés 5 Date d'inscription mardi 22 juillet 2008 Statut Membre Dernière intervention 22 juillet 2008
22 juil. 2008 à 13:21
Non le format du champ est "varchar" donc c'est du texte. Comment dois-je faire pour qu'il le trie comme si c'était un "chiffre"? Car je ne peux pas changer le format du champ.
Merci.
0
Frappe Misere Messages postés 2677 Date d'inscription vendredi 22 février 2008 Statut Membre Dernière intervention 10 août 2011 568 > livatill Messages postés 5 Date d'inscription mardi 22 juillet 2008 Statut Membre Dernière intervention 22 juillet 2008
22 juil. 2008 à 13:29
dans ta requete, tu ajoutes un champs qui sera : clng(ton champ en varchar)
pour le transformer en valeur numérique et tu te sers de celui là pour ton order by
0
livatill Messages postés 5 Date d'inscription mardi 22 juillet 2008 Statut Membre Dernière intervention 22 juillet 2008 > Frappe Misere Messages postés 2677 Date d'inscription vendredi 22 février 2008 Statut Membre Dernière intervention 10 août 2011
22 juil. 2008 à 13:43
Je suis en MYSQL 5 et il dit que ce fonction n'existe pas. Merci bcp quand même!
0
Frappe Misere Messages postés 2677 Date d'inscription vendredi 22 février 2008 Statut Membre Dernière intervention 10 août 2011 568
22 juil. 2008 à 14:09
peut etre "clong", regarde l'aide pour l'orthographe exact mais elle existe.
0
Christounet Messages postés 1264 Date d'inscription mercredi 26 septembre 2007 Statut Membre Dernière intervention 29 juillet 2010 1 384
22 juil. 2008 à 14:19
Bonjour livatill, Frappe Misere

Avec Mysql, il existe la fonction CAST qui permet de convertir une variable en un autre type, dans ton cas le code devrait être le suivant
select count(idSms) as nbrSMS, numTirage from sms_report group by numTirage
order by cast(numTirage as signed)


A plus
0
Salut Christounet,

Désolé de t'écrire en privé mais j'ai vu que t'avais réussi à résoudre un problème identique au miens et je n'y arrive toujours pas...

Je fais la requête suivante:
SELECT idgis FROM gis WHERE gis.nom_loc_gis LIKE "%valeur%" ORDER BY num_loc_gis, nom_loc_gis

et lorsque j'affiche le résultat, il ne me trie pas les données convenablement à savoir, il m'affiche
cal 1, cal 10, cal 11, cal 12, ..., cal 2, cal 3

Tu avais proposé la solution d'écrire
SELECT idgis FROM gis WHERE gis.nom_loc_gis LIKE "%valeur%" ORDER BY cast(num_loc_gis as signed), nom_loc_gis

mais à ce moment-là, il m'affiche
cal 1, cal 13, cal 12, cal 11, cal 10, cal 9, ... cal 2, cal 14
(j'ai 19 entrée sous cal)

Aurais-tu une solution pour me sauver???
0
Christounet Messages postés 1264 Date d'inscription mercredi 26 septembre 2007 Statut Membre Dernière intervention 29 juillet 2010 1 384 > moaaa
26 mars 2009 à 10:50
Bonjour,

Peux-tu m'indiquer le type des variables idgis , nom_loc_gis et num_log_gis ainsi que quelques exemples des valeurs contenues dans les variables, cela devrait peu-être me donner une idée de solution.

A plus
0
Moaaa Messages postés 4 Date d'inscription mercredi 7 novembre 2007 Statut Membre Dernière intervention 26 mars 2009 > Christounet Messages postés 1264 Date d'inscription mercredi 26 septembre 2007 Statut Membre Dernière intervention 29 juillet 2010
26 mars 2009 à 13:42
Salut Christounet,

Merci d’ores et déjà pour la promptitude de ta réponse. Effectivement, j'avais oublié ce petit "détail" -> je baigne dedans depuis un moment donc pour moi c'était évident

Alors "idgis" est un entier dont on lui rentre la valeur (pas en auto-increment et donc valeurs non successives)
"nom_loc_gis" et "num_log_gis" sont tous deux de type VARCHAR() ayant l'interclassement ucs2_unicode_ci (je ne pense pas que ça change quelque chose mais je te donne toutefois l'info)

Pour les données contenues, voici quelques exemples:

idgis        |       nom_loc_gis           |      num_loc_gis
---------------------------------------------------------------
93           |            Vale             |            1
3237         |            Vale             |            2
91           |            Vale             |            3
90           |            Vale             |            4
89           |            Vale             |            5
80           |            Vale             |            6
79           |            Vale             |            7
1540         |            Vale             |            8
73           |            Vale             |            9
83           |            Vale             |            10
2540         |            Vale             |            11
2544         |            Vale             |            12
554          |            Vall             |            1
555          |            Vall             |            2
556          |            Vall             |            3
557          |            Vall             |            4


Avec la requête
SELECT idgis FROM gis WHERE gis.nom_loc_gis LIKE "%val%" ORDER BY nom_loc_gis, num_loc_gis

le résultat obtenu est
vale 1, vale 10, val 11,...,vale 19, vale 2, vale 20, vale 21, vale 22, ..., vale 3, vale 30,...
et en essayant avec le "cast":
SELECT idgis FROM gis WHERE gis.nom_loc_gis LIKE "%val%" ORDER BY nom_loc_gis , cast(num_loc_gis as signed)

c'est encore pire ->
vale 40, vale 29, vale, 28, ..., vale 23, vale 22, vale 30, vale 31, vale 39, vale 38 etc. J'ai regardé comment il arrivait à ce résultat mais alors là???

Si tu te poses la question (fortement justifiée) de savoir pourquoi le "num_loc_gis" est en VARCHAR() puisque visiblement, il n'y a que des chiffres, c'est que c'est une énorme base de données donc voici un tout petit extrait et on peut trouver des num_loc_gis ayant des valeurs "11 a", "20 bis", etc.

Enfin, une solution serait de mettre un "0" pour les chiffres inférieur à dix, mais étant donné qu'il y a un grand nombre d'enregistrements, je ne sais pas si il existe une méthode pour forcer cela.

Merci encore pour le temps que tu me consacres et @++

p.s: Suis fan de ta citation!!!
p.s.2: T'enverrai une bière virtuelle à défaut de pouvoir t'en payer une vraie (encore que...)
0
Christounet Messages postés 1264 Date d'inscription mercredi 26 septembre 2007 Statut Membre Dernière intervention 29 juillet 2010 1 384 > Moaaa Messages postés 4 Date d'inscription mercredi 7 novembre 2007 Statut Membre Dernière intervention 26 mars 2009
26 mars 2009 à 14:35
Bonjour,

J'ai crée une table Test dans Mysql avect quelques données de ta table et la requête suivante devrait faire ce que tu veux
SELECT idgid , nom_loc , num_loc FROM Test
ORDER BY nom_loc, lpad( cast( num_loc AS char( 10 ) ) , 15, '0' )
Résultat:
93  	  Vale  	1
3237   Vale 	2
90 	  Vale 	4
91 	  Vale 	6
83 	  Vale 	10
2544   Vale 	11
554     Vall 	2
1540   Vall 	10a
2345   Vall 	20bis

La fonction LPAD complète à gauche la chaîne de caractères (cast(num_loc as char(10)) avec le caractère 0 pour obtenir une chaîne de 15 caractères. J'ai choisi 10 et 15, tu peux évidemment changer ces deux valeurs si ta variable num_loc contient plus de 10 caractères.

A plus
PS: Je ne suis pas un grand amateur de bière mais plutôt de vin rouge.
0
Moaaa Messages postés 4 Date d'inscription mercredi 7 novembre 2007 Statut Membre Dernière intervention 26 mars 2009 > Christounet Messages postés 1264 Date d'inscription mercredi 26 septembre 2007 Statut Membre Dernière intervention 29 juillet 2010
26 mars 2009 à 16:04
T'es un chef Christounet!!!

1000 merci!!! Et particulièrement merci d'avoir pris le temps de faire les tests et d'avoir résolu mon problème...

Et surtout bravo, t'es vraiment un baron!

++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
livatill Messages postés 5 Date d'inscription mardi 22 juillet 2008 Statut Membre Dernière intervention 22 juillet 2008
22 juil. 2008 à 16:37
Merci beaucoup Christounet, ça marche parfaitement à présent!
a++
0