ggbce Posté(e) le 7 décembre 2005 Partager Posté(e) le 7 décembre 2005 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 More sharing options...
Helfima Posté(e) le 7 décembre 2005 Partager Posté(e) le 7 décembre 2005 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 More sharing options...
ggbce Posté(e) le 7 décembre 2005 Auteur Partager Posté(e) le 7 décembre 2005 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 More sharing options...
theocrite Posté(e) le 7 décembre 2005 Partager Posté(e) le 7 décembre 2005 ;) Lien vers le commentaire Partager sur d’autres sites More sharing options...
ggbce Posté(e) le 7 décembre 2005 Auteur Partager Posté(e) le 7 décembre 2005 ... si tu aurais lu mon message au complet tu aurais bien vu que ce n'est pas résolu Lien vers le commentaire Partager sur d’autres sites More sharing options...
theocrite Posté(e) le 7 décembre 2005 Partager Posté(e) le 7 décembre 2005 Bah c'était pas très clair non plus. Je l'ai lu ton post, mais j'ai pas compris que tu avais encore un problème. Qu'est ce que ça te renvoie ça ? C'est trié comment ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
Baldurien Posté(e) le 7 décembre 2005 Partager Posté(e) le 7 décembre 2005 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 More sharing options...
Helfima Posté(e) le 8 décembre 2005 Partager Posté(e) le 8 décembre 2005 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 More sharing options...
Baldurien Posté(e) le 8 décembre 2005 Partager Posté(e) le 8 décembre 2005 moralité ? tu fais une boucle pour les résultats, une seconde (voir deux, tri = O(n^2) ou O(nln(n)) selon les cas), puis une troisième quand tu peux faire ça en mySQL :) C'est plus lent (même si y a pas le choix) cf. commentaires http://dev.mysql.com/doc/refman/5.0/en/string-functions.html Lien vers le commentaire Partager sur d’autres sites More sharing options...
theocrite Posté(e) le 8 décembre 2005 Partager Posté(e) le 8 décembre 2005 Pour éviter, le O(n^2), tu peux écrire ton url en suite de bit ce qui donne un nombre entre 0 et 2^32-1, ce qui est aussi rapide à tirer. Lien vers le commentaire Partager sur d’autres sites More sharing options...
ggbce Posté(e) le 8 décembre 2005 Auteur Partager Posté(e) le 8 décembre 2005 Ouais... il y a plusieurs possibilités ! Mais pas beaucoup de simple pour trier de simple chiffres 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 More sharing options...
ggbce Posté(e) le 25 janvier 2011 Auteur Partager Posté(e) le 25 janvier 2011 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 More sharing options...
ggbce Posté(e) le 25 janvier 2011 Auteur Partager Posté(e) le 25 janvier 2011 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 More sharing options...
Amour Posté(e) le 25 janvier 2011 Partager Posté(e) le 25 janvier 2011 Il fallait y penser, bien vu Lien vers le commentaire Partager sur d’autres sites More sharing options...
piwi82 Posté(e) le 18 février 2011 Partager Posté(e) le 18 février 2011 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 More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.