Aller au contenu

[RESOLU] [PHP] [MySQL] ORDER BY pour des nombres


ggbce

Messages recommandés

Comment peut-on faire pour trier différement avec des nombres lorsque l'on récupère les données d'une base de données ?

Je m'explique:

j'ai une liste à créer des adresses IP utilisées. les résultats sont du genre: 192.168.1, 192.168.2, 192.168.23,....

Pour faire mon tableau je dois récupérer les données depuis ma BDD MySQL avec PHP avec une requête du genre:

SELECT id,nom,ip_addr FROM inv_equipement ORDER BY ip_addr

Ce qui se produit c'est que MySQL fait le tri autrement que voulu.

Exemple du résultat:

192.168.1.1

192.168.1.10

192.168.1.12

192.168.1.2

192.168.1.3

192.168.1.37

192.168.1.4

au-lieu de:

192.168.1.1

192.168.1.2

192.168.1.3

192.168.1.4

192.168.1.10

192.168.1.12

192.168.1.37

Même si je pourrais spécifier à ORDER BY de trier qu'avec une seule partie des nombres (après le dernier point) j'aurais le même problème...

Est-ce qu'il y a une solution (d'autre méthodes pour ORDER BY) ?

Merci

Lien vers le commentaire
Partager sur d’autres sites

effectivement c'est balo ca

en fait ta requete est bonne le seul truc qui pêche c'est que tu tries des chaine de caractère donc elles sont bien ordonnées, c'est le tri normal.

peut être qu'il y a une option de tri en sql qui permet d'avoir une méthode différente

au même tritre que la fonction sort enphp ou tu peux choisir la méthode de tri

fonction sort

Lien vers le commentaire
Partager sur d’autres sites

Il y a peut être quelque chose de possible avec sort() de php effectivement. Au-lieu d'avoir un ORDER BY dans ma requête SQL, je FETCH le tout vers un sort() et ensuite j'affiche avec ECHO !

Il y a un exemple similaire sur le site de PHP (le lien que tu m'as donné). L'exemple explique comment trier par ordre alphabétique des noms de personnes avec les 3 champs (prénom, deuxième nom et nom de famille) lorsque le deuxième nom n'existe pas...

$index = 0;
while ($rows = mysql_fetch_array($sqlResult)) {
  extract($rows);
  $my_array[$index]['sortname'] = strtolower(preg_replace("/[^a-zA-Z]/", "", "$lastname$firstname$middlename"));
  $my_array[$index]['name'] = trim("$lastname, $firstname $middlename");
  $index++;
}
sort($my_array); // now in perfect alpha order

Lien vers le commentaire
Partager sur d’autres sites

Si tu veux trier correctement tes IP ... ne les stocke pas sous la forme de chaînes de caractères?

Soit tu y vas à la barbare avec un champ type INT non signé contenant l'ip codée sur 4 octets (cf. http://fr.php.net/manual/fr/function.ip2long.php ) et son inverse http://fr.php.net/manual/fr/function.long2ip.php . L'avantage c'est que tu peux trier avec une méthode entière puisque justement c'est des nombres.

Soit tu y vas à la barbare bis, avec 4 champs type TINYINT (1 octet = 255 valeurs max) contenant les 4 nombres associés à ton IP. Ton tri se faisant simplement par ORDER BY Ip1, ..., Ip4

Bien sûr, doit y en avoir encore une autre astuce, mais braiffe.

Lien vers le commentaire
Partager sur d’autres sites

moi je vois comme ceci le truc

recherche les ip avec une requete basique sql

Soit une base avec comme champ

id

ip

tu places les resultats dans un tableau:

while ($rows = mysql_fetch_array($sqlResult)) {
$tab_ip[$row["ip"]] = split(".",$row["ip"]);
}

donc tu devrai avoir un tableau du genre

[192.168.1.2] = array ([0] =>192,[1] =>168,[2] =>1,[3] =>2)

[192.168.1.1] = array ([0] =>192,[1] =>168,[2] =>1,[3] =>1)

ect...

je sais pas si asort(cette fonction concerve les clés très important) va trier le tableau dans le bon ordre donc a tester

peu etre voir aussi array_multisort

asort($tab_ip,SORT_NUMERIC)

après suffit de faire

foreach ($tab_ip AS $key => $value){
echo $key;
}

Lien vers le commentaire
Partager sur d’autres sites

Ouais... il y a plusieurs possibilités ! Mais pas beaucoup de simple pour trier de simple chiffres :francais:

Merci de vos conseils, dès que j'aurais testé et trouver je vous recontacte. Pour le moment j'ai 2 serveur Windows Server 2003 à installer comme DC dans mon entreprise ce qui est ma priorité.

Merci encore

Lien vers le commentaire
Partager sur d’autres sites

  • 5 ans après...

Mieux vaut tard que jamais...

J'avais à faire un tri similaire dernièrement et je suis retombé sur ce vieux message que j'avais moi-même écrit. Et bien voilà la solution pour trier un nombre dans un ordre numérique lorsque celui-ci est écrit dans une colonne de type TEXt, VARCHAR, etc (non INTEGER):

SELECT number FROM table ORDER BY (number+0);

Résultat:
1
2
3
4
5
6
7
8
9
10
11
...
98
...
999

(nom_du_champ + 0 ) convertit le texte/caractères dans le champ en INTEGER.

Lien vers le commentaire
Partager sur d’autres sites

Et pour mon nouveau tri que je voulais faire c'était un peu plus complexe. J'ai un inventaire de pièces élecronique. Dans cet inventaire j'ai 2 colonnes. La première colonne contient le numéro de pièce d'origine (ex: 2SC2055) et le numéro de pièce équivalent ECG/NTE (ex.: NTE123). Je veux trier soit par le numéro de pièce original ou par les numéro équivalent. Exemple:

Tri par le numéro de pièce d'orgine. Cela était simple car c'est alphanumérique aléatoire. Un simple SELECT ... ORDER BY no_piece fait le travail:

2SC2055    - NTE123
2SC2056    - NTE899
BU984      - NTE54
IC988TR999 - NTE1999

Pour le tri par le numéro équivalent, je devais trier par la portion du texte sans inclure les 3 premiers caractères (NTE) et de plus trier en ordre numérique. Exemple:

BU984      - NTE54
2SC2055    - NTE123
2SC2056    - NTE899
IC988TR999 - NTE1999

Voilà la solution. Il faut créer un SUBSTRING en premier pour générer un champ "virtuel" qui ne contient que la portion des chiffres dans le texte NTE0000 et ensuite faire un tri sur ce champ virtuel en lui disant en plus de convertir le texte en numeric. Exemple de la requete:

SELECT no_piece_original,SUBSTRING(equivalent, 4) AS equivalentnbr,equivalent FROM inventaire ORDER BY (equivalentnbr + 0) ASC;

SUBSTRING(equivalent, 4) -> dit de créer un champ virtuel en commençant au 4e caractère uniquement. Donc le mot NTE54 devient 54 !

Lien vers le commentaire
Partager sur d’autres sites

  • 4 semaines après...

Pour les transformations d'adresses IP, il y a des fonctions MySQL prévues pour ça :

- INET_ATON() qui transforme une adresse IP en un entier de 32bits.

- INET_NTOA qui fait l'opération inverse.

Du coup pour trier tes adresses IP tu fais tout simplement :

SELECT ... ORDER BY INET_ATON(`ip_addr`) ASC;

Désolé d'arriver si tard sur le topic...

Source :http://dev.mysql.com...ction_inet-aton

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...