Bonjour à tous,

SELECT * FROM `formationscompetences` WHERE idPositionPoste = '".$idPosteP1."'ORDER BY `positionLigne` ASC

Ce que je veux

Je cherche à lister mes lignes dans l'ordre croissant selon les nombres se trouvant dans la colonne "positionLigne".
L'ordre croissant est en théorie comme ceci:
Ligne A: 0
Ligne B: 1
Ligne C: 2
Ligne D: 3
Ligne E: 4
Ligne F: 12
Ligne G: 16
Ligne H: 19
Ligne I: 21
Ligne J: 25
Ligne K: 31
Ligne L: 34

Ce que j'obtiens

Mais voilà ce que j'obiens:
Ligne A: 0
Ligne B: 1
Ligne F: 12
Ligne G: 16
Ligne H: 19
Ligne C: 2
Ligne I: 21
Ligne J: 25
Ligne D: 3
Ligne K: 31
Ligne L: 34
Ligne E: 4

Que dois-je faire à votre avis?
Je suppose que c'est la façon dont je stocke mes valeurs?
Le champs en question est un varchar(10)

Merci beaucoup pour votre aide!

4 réponses


Kareylo
Réponse acceptée

Exactement, le problème vient du fait que tu stockes en varchar.

Le ORDER BY se faire caractère par caractère en partant du premier caractère sur un varchar (D'où 19 < 2)

Si tu es sûr et certain que tu n'auras que des entiers dans ton champ et que tu n'as pas la possibilité de changer de type de champ (on ne sait jamais), tu peux caster ce champ en tant que int, tu obtiendrais quelque chose comme ça (elle est pas obtimale, d'autres personnes corrigeront sûrment pour moi) :

SELECT * FROM `formationscompetences` 
    WHERE idPositionPoste = '".$idPosteP1."'
    ORDER BY CAST(`positionLigne` AS INTEGER) ASC

Ca devrait avoir l'effet escompté.

Cependant, si tu peux changer le type de ton champ position, change le en INTEGER pour éviter ce genre de conversion à la volée qui est assez gourmande.

Hexa
Auteur

Bonjour Kareylo,
merci pour ta réponse. Tu as vu juste et mon souci a disparu!
Comme il n'y aura jamais autre chose qu'un nombre dans ce champs, je l'ai passé en int(10) et tout est rentré dans l'ordre.

Il faut que je me penche en peu sur la valeur de INT.
INT(10) = 10 caractères numériques maxi? C'est ça?

Le (10) n'apporte rien, il sera d'office stocké sur 4 byte (donc entre -2147483648 et 2147483647), il est plus là à titre "indicatif".
Si tu veux pouvoir choisir la valeur optimale pour ton cas, je te conseille de regarder la page de documentation de MySQL Types entiers

Hexa
Auteur

Super,
merci beaucoup pour ton aide!

A bientôt