Classement d'une table par numéro comme plan comptable

Dryzd
Invité n'ayant pas de compte PHPfrance

31 juil. 2007, 10:45

Bonjour ;)

J'essaie désespérement de classer le résultat d'une requête mais je n'y arrive pas. Je m'explique. La table contient qqch comme ca (enregistré dans le désordre) :
221 - A
1 - J
21 - F
12 - C
11 - B
2 - K
22 - L
3 - I
...
Je voudrais qu'une requête me retourne ça (classement comme le plan comptable) :
1 - J
11 - B
12 - C
2 - K
21 - F
22 - L
221 - A
3 - I
...

Mais, et c'est là où j'ai besoin de votre aide, lorsque je boucle sur le résultat pour l'afficher, j'ai ça(classement informatique des valeurs, logique):
1 - J
2 - K
3 - I
11 - B
12 - C
21 - F
22 - L
221 - A
...

Est-ce que vous avez une idée du comment du pourquoi de la chose ?

Merci d'avance de votre aide ;=)

Dryzd

d0m
Mammouth du PHP | 1141 Messages

31 juil. 2007, 11:10

forcement ton premier champ est un entier, si tu lui demandes de les ordonner il ne va pas placer 11 avant 2.

J'ai utilisé le même genre de numérotation et j'ai crée un champ non pas d'entier mais de chaine de caractère (varchar) avec les numéro séparés par des points.
Et j'y ai mis la numérotation sous cette forme :
'1'
'1.1'
'1.2'
'2'
'2.1'
....

Et là en faisant en ordonnant le résultat de la requête sur ce champ ca marche comme tu le veux.

Dryzd
Invité n'ayant pas de compte PHPfrance

31 juil. 2007, 11:19

Merci de cette proposition.
J'ai profité du temps que j'avais pour chercher. Et j'ai trouvé une réponse plus adaptée, je trouve.
Il suffit, dans la requête de rajouter :
ORDER BY CAST(nom_du_champ AS CHAR)

Et ca fonctionne !
Peut-être que ca pourra servir à d'autres ;)

Merci encore et sûrement à bientôt

Dryzd

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

31 juil. 2007, 11:27

Modération :
Puisque ta question est résolue, j'ajoute le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il contient une solution.

Tu peux réaliser cette opération toi-même
en cliquant sur le bouton Image qui s'affiche en haut à gauche de ce sujet
si tu as posté le 1er message en tant que membre (inscrit et identifié).

Alors... inscris-toi !!! ;)

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

ViPHP
ViPHP | 5924 Messages

31 juil. 2007, 13:14

Dryzd, permet moi de te conseiller d'utiliser la solution proposée par d0m car, si je ne me trompe, avec un CAST, un index sur le champ en question est inutilisable, et donc si tu as des tables conséquentes, une requète de tri qui prendrait quelques millièmes de seconde avec un index, prendra des dixièmes de secondes voire des secondes sans index.
L'idéal serait donc d'utiliser une colonne varchar indexée, pour optimiser les tris et sélections.

d0m
Mammouth du PHP | 1141 Messages

31 juil. 2007, 13:26

et il y a en plus ce problème :
111
peut être interprété comme :
1.11
1.1.1
11.1
111

ViPHP
ViPHP | 5924 Messages

31 juil. 2007, 13:32

Là j'ai des doutes, avec un CAST, normalement 111, il est transformé en la chaine '111'

d0m
Mammouth du PHP | 1141 Messages

31 juil. 2007, 13:36

Là j'ai des doutes, avec un CAST, normalement 111, il est transformé en la chaine '111'
Je parlais niveau conceptuel, c'est bien beau avec peu de parties et sous parties mais imaginons qu'il y ai plus de 9 sous parties, avec la méthode des entiers il n'y aucun moyen de différencier
1.11 de 11.1 de 1.1.1 de 111

ViPHP
ViPHP | 5924 Messages

31 juil. 2007, 14:34

Ah, bah après, cest à lui de correctement conceptualiser son machin.