Trier en ordre naturel sur un champ alphanumérique

Mammouth du PHP | 881 Messages

01 oct. 2007, 05:21

Bonjour!

Je suis tenu d'avoir un champ alphanumérique pour enregistrer des classements en course cycliste. Pourquoi? Parce que certains coureurs peuvent être disqualifiés ou éliminés par les juges ou qu'ils peuvent tout simplement abandonner et que leur rang - alors - n'est pas 999, mais "disq" ou "DNF" ou autre code connu.

Voilà donc mon problème. Le classement final est inscrit dans un champ alphanumérique et lors du tri, je me retrouve avec les rangs classés ainsi:


1
10
11
12
13
...
2
20
21
21


alors que je voudrais qu'ils soient en ordre naturel comme me le permettrait PHP (http://be.php.net/natsort)


1
2
3
4
5
...
10
11
12
...
20
21
22


comment faire?

voici ma requête actuelle:

$requRESU = "SELECT * FROM resultats 
     WHERE circuit_id = ".$Circuit." AND dte_course LIKE '2007-05-01' 
     ORDER BY Rang_final ASC, Dossard ASC";

C'est le champ Rang_final qui contient le classement et qui est en alphanumérique.

Merci à l'avance
Soyez artisans de paix

Mammouth du PHP | 19672 Messages

01 oct. 2007, 06:02

Explore la doc SQL à propos de CAST() pour faire un transtypage qui te donnerait un classement numérique normal.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 881 Messages

01 oct. 2007, 15:00

Merci, ça marche

Voici ma nouvelle requête:
SELECT * FROM resultats WHERE circuit_id = 3 AND dte_course LIKE '200705 1' ORDER BY CAST(Rang_final as UNSIGNED) ASC, Dossard ASC
Soyez artisans de paix

Mammouth du PHP | 881 Messages

08 nov. 2007, 17:10

Je reviens avec ma question, mais avec plus de complications.
Je veux maintenant avoir deux niveaux de CAST, pensez-vous que c'est possible?

Je pars de la requête du message précédent et je veux maintenant qu'un autre champ soi trié de la sorte. Voici les essais que j'ai faits et pour lesquels j'ai obtenu des messages d'erreur:
SELECT * FROM resultats WHERE circuit_id = 3 AND dte_course LIKE '200705 5' 
ORDER BY CAST(Categ as CHAR) DESC, BY CAST (Rang_final as CHAR) ASC

SELECT * FROM resultats WHERE circuit_id =3 AND dte_course LIKE '200705 5'
ORDER BY CAST( Categ AS CHAR, Rang_final AS CHAR ) ASC

Merci encore.
Soyez artisans de paix

Mammouth du PHP | 19672 Messages

08 nov. 2007, 17:50

Logique, regarde bien ce que tu as mis en paramètre de CAST() dans ta requête : je ne t'en dis pas plus, ça, c'est une faute d'inattention ;)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 881 Messages

08 nov. 2007, 18:42

J'allais écrire que je ne voyais rien jusqu'à ... vision: deux BY!!!!

Et en plus ... il y avait un espace entre CAST et (


Merci spécial à Cyrano qui ne ma pas donné la réponse toute cuite mais m'a laissé chercher un peu.
Modifié en dernier par Patriboom le 08 nov. 2007, 20:51, modifié 1 fois.
Soyez artisans de paix

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

08 nov. 2007, 19:24

j'ai obtenu des messages d'erreur
Les messages d'erreurs ont cette particularité d'indiquer précisément où se trouve l'erreur, c'est pourquoi on demande généralement de les poster.