Problème avec order by
Résolu
livatill
Messages postés
5
Statut
Membre
-
nzo -
nzo -
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!
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!
A voir également:
- Problème avec order by
- Files by google - Accueil - Applications & Logiciels
- By click downloader avis - Forum Enregistrement / Traitement audio
- Order@live-helper.com - Forum Consommation & Internet
- By click downloader ne fonctionne plus - Forum Enregistrement / Traitement audio
- Ads by cooking ✓ - Forum Virus
5 réponses
tu es sur que le format de ton champs de donnée est bien "chiffre" ?
là il trie comme si c'etait du texte.
là il trie comme si c'etait du texte.
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
A plus
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
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:
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
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???
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???
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:
Avec la requête
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":
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...)
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...)
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
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.
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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.