Order BY, tri alphabétique, mais pas que...

Résolu/Fermé
olive33 - 9 nov. 2015 à 21:55
 olive33 - 12 nov. 2015 à 16:55
Bonjour,

Je vous explique rapidement mon problème. J'ordonne dans une BDD des immatriculations de véhicules.

Je fais donc une requête du type :

$requete = "SELECT * FROM `$table` ORDER BY 'lettres',(numero+0)";

Les champs lettres et numeros sont des champs de type Varchar (peut-être aurait-il fallu mettre le champ numéro en INT d'ailleurs...)

Le (numero+0) est la solution que j'ai trouvé pour bien ranger les numéro dans l'ordre de 1 à 9999 (sinon il classe ainsi : 1,10,11...19,2,20,21...29,3,30,...39 et ainsi de suite)

Par contre, pour les lettres, je suis bloqué, le classement alphabétique ne considérant pas les choses comme elles se passent dans la réalité.
Je m'explique, les immatriculation vont de 1 A 75 à 9999 A 75 puis 1 B 75 à 9999 B 75 et ainsi de suite jusqu'à 9999 Z 75. Puis, on repart à 1 AA 75 à 9999 AA 75, 1 AB 75 à 9999 AB 75 et pareil jusqu'à 9999 ZZ 75 et enfin 1 AAA 75 à 999 AAA 75, 1 AAB 75 à 999 AAB 75 et ainsi de suite jusqu'à 999 ZZZ 75.

(Le 75 désignant ici le département et étant stocké indépendamment dans un champ à part)

Sauf que, SQL n'ordonne pas les choses de la même manière. Par ma requête actuelle, il va faire :

1 A 75 à 9999 A 75, puis 1 AA 75 à 9999 AA 75, puis 1 AAA 75 à 999 AAA 75 et ce n'est que lorsqu'il aura atteint 999 AZZ 75 qu'il reviendra au 1 B 75. En gros, il ne tient pas compte du nombre de lettres mais de la chronologie alphabétique, pour lui c'est un mot qui commence par A et, dans un dictionnaire, A, AA, AAA, sont avant A, AA et AAB et bien avant tout ce qui commencera par B soit B, BA, BAA...

La question est donc, comment forcer la clause ORDER BY a énumérer de A à Z tous seuls, puis AA à ZZ tous seuls et enfin AAA à ZZZ ?

Merci par avance pour votre aide

A+ Olive33

2 réponses

Tatanos Messages postés 966 Date d'inscription lundi 24 mars 2008 Statut Membre Dernière intervention 26 mai 2016 156
12 nov. 2015 à 16:48
Salut,

Tente ceci :

SELECT * FROM $table
ORDER BY CHAR_LENGTH(lettres) ASC, lettres,(numero+0)
1
Salut,

Nickel ça marche ! Merci beaucoup. Ca à l'air tout bête comme code, mais il m'aura bien pris la tête celui-ci...

Encore merci !

Bonne soirée
0