Ordre de tri: affichage des unités, dizaines, centaines...

Petit nouveau ! | 4 Messages

06 avr. 2023, 10:58

Bonjour à toutes et tous,
Commençons par le commencement: je suis une pive en PHP.

Ensuite, j'ai un problème d'affichage de listes. Je bosse sur une page qui affiche les corrections d'un livre d'exercices, en entrant les références des dits exercices dans un champ. Ces exercices sont par exemple numérotés: EN1, EN2, EN3, [...], EN10, EN11, [...], EN100, EN101, etc. (EN = «énergie», le chapitre).

Le problème, c'est que les résultats s'affichent ainsi:

EN1
EN10
EN100
EN101

EN102
EN103
[…]
EN109
EN11
EN110
EN111
EN112
EN113
EN114
[…]
EN119
EN12
EN120
EN121
EN122
[…]
EN129
EN13
EN130
EN131
[…]
EN139
EN14
EN140
EN141
[…]
EN198
EN199
EN2
EN20
EN200
EN201
[…]
EN208
EN209
EN21
EN210
[…]

EN1 est directement suivi de EN10, qui est lui-même suivi de EN100. Après les EN100 (EN199 en l'occurrence) seulement, vient EN2 (suivi de EN20, EN200, etc., eux-mêmes suivis de EN3, EN30, EN300, etc.). Les réponses à l'exercice 2 viennent donc après celles des exercices 10 et 100.

Alors que je souhaiterais avoir une suite logique selon la numérotation des exercices:

EN1
EN2

EN3
EN4
[...]
EN9
EN10
EN11
[...]
EN99
EN100
EN101
etc.

J'utilise actuellement comme code:
$count = $BDD->query("select COUNT(*) from tablex where columnx like '%".$_GET['content']."%' ORDER BY columnx ASC");

Une idée de comment faire pour avoir mes exercices dans le bon ordre ? (sans avoir à en modifier le nom de EN1 en EN001, par exemple).

Un grand merci d'avance si vous avez des suggestions ! :)

shiva108

Mammouth du PHP | 2703 Messages

06 avr. 2023, 11:07


Petit nouveau ! | 4 Messages

06 avr. 2023, 11:27

Merci ! Donc, ça donnerait quelque chose comme ça?

$count = $BDD->query("select SUBSTRING(*) from tableX where columnX like '%".$_GET['content']."%' ORDER BY columnX ASC");

(désolé, je nage vraiment en PHP...)

Avatar du membre
Mammouth du PHP | 1609 Messages

06 avr. 2023, 12:58

Trouvé sur stackoverflow :
SELECT *,
CONVERT(REPLACE(columnx, 'EN', ''), UNSIGNED INTEGER) AS columnxNumeric
FROM tableX
WHERE columnx LIKE 'EN%'
ORDER BY columnxNumeric ASC;

PS : si $_GET content est bien égal à EN ou tout autre code du genre (FR, etc) et que les lettres sont toujours au début de la colonne, le LIKE 'EN%' (sans % au début) permet d'exploiter un index sur la colonne ce qui n'est pas possible avec le % devant.
Développeur web depuis + de 20 ans

Petit nouveau ! | 4 Messages

06 avr. 2023, 13:52

Merci ! Mais j'ai d'autres préfixes que EN, comme EL, ME, OP, etc. selon les chapitres (EL = électricité; ME = mécanique, OP = optique, etc.)... du coup, je je laisse juste les ' ' sans le EN au milieu ?

Avatar du membre
Mammouth du PHP | 1609 Messages

06 avr. 2023, 13:55

Si je reprends ta requête d'exemple, tu injectais $_GET['content'] qui je suppose contient le préfixe, donc tu as juste à faire pareil aux deux endroits de la requête ou le préfixe doit être dynamique.
Développeur web depuis + de 20 ans

Petit nouveau ! | 4 Messages

06 avr. 2023, 16:42

Cool, merci, je vais essayer ! :)