Problème avec order by

Résolu
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!
Configuration: Windows XP
Firefox 3.0

5 réponses

  • Votes
  • Date
  • Date décroissante
  1. Tu peux afficher la requête que tu fais, ça sera plus simple pour voir l'erreur :)
    1. 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.
  2. tu es sur que le format de ton champs de donnée est bien "chiffre" ?
    là il trie comme si c'etait du texte.
    1. 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.
    2. @livatilldans 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
    3. @Frappe MisereJe suis en MYSQL 5 et il dit que ce fonction n'existe pas. Merci bcp quand même!
  3. peut etre "clong", regarde l'aide pour l'orthographe exact mais elle existe.
    1. 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
      1. 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???
      2. @moaaaBonjour,

        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
      3. @ChristounetSalut 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...)
      4. @MoaaaBonjour,

        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.
      5. @ChristounetT'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!

        ++
    2. Merci beaucoup Christounet, ça marche parfaitement à présent!
      a++