Tri Varchar avec lettre et chiffre ?

Tri Varchar avec lettre et chiffre ? - SQL/NoSQL - Programmation

Marsh Posté le 25-12-2011 à 15:14:10    

Salut!
 
J'ai un moteur de recherche où les titres des résultats sont des codes de type 4 lettres puis 3 chiffres (Ex : KEC012) dans un colonne nommée Code de type Varchar, Defaut=null, latin1_general_cs et Null=Oui
Or les résultats ne sont jamais triés dans l'ordre alphabétique+numérique avec ce genre de ligne :
 

Code :
  1. $requete=mysql_db_query("$sql_bdd","select count(*) from recherche where motcles like $phrase ORDER BY CODE",$db_link);


 
Dois-je changer le type "Varchar" ? Ou Order by code nest pas bon pour ça ?
 
Merci d'avance !

Message cité 1 fois
Message édité par COCOOP le 25-12-2011 à 15:15:20
Reply

Marsh Posté le 25-12-2011 à 15:14:10   

Reply

Marsh Posté le 26-12-2011 à 18:36:06    

Pleaseee c'est pour un projet à rendre le 2 janvier.. !

Reply

Marsh Posté le 27-12-2011 à 00:16:30    

je vais peut être dire une ânerie, mais il me semble, si je comprends bien ce que tu veux faire, qu'il manque un group by (tu n'as pas qu'une seule ligne de résultat là ?)
Donc à partir de là le order n'a pas tellement de sens ...


---------------
http://nisalon.labrute.com/
Reply

Marsh Posté le 27-12-2011 à 00:28:07    

Salut! Merci de ta réponse!
 
J'ai bien plusieurs résultats/codes pour certaines recherches mais pas classés dans "l'ordre alphanumérique".
Qu'est-ce que ce group by ?
A la base c'est un script de moteur de recherche que j'ai trouvé sur le net, je l'ai légèrement adapté


Message édité par COCOOP le 27-12-2011 à 00:28:37
Reply

Marsh Posté le 27-12-2011 à 10:30:32    

Est-ce un select count(*) ou un select * que vous voulez ?
Votre requête select count(*) vous ramène une seule ligne qui est le nombre d’occurrences. Et il ne peut pas y avoir de tri avec une seule ligne.
Donc, je vais supposer que c'est select *
 
Changer le type Varchar (en quoi ?) ne devrait rien changer. Mais vous pouvez essayer pour voir, ça ne mange pas de pain.
 
Le group by n'est pas nécessaire ici, car c'est un select * ou un select count(*) global et non pas pour une colonne particulière, ou pour certaines colonnes. Le problème se situerait donc ailleurs.
 
Normalement le tri se fait correctement avec le Order by. Donc, c'est bizarre. Mais je ne visualise pas bien ce qu'il y a dans la base, ce que sort la requête, et ce que devrait sortir la requête. Un exemple de 3 ou 4 lignes serait le bienvenu.
 
Si vous avez des données KEC002, KEC012, KEC312, alors ça devrait bien se passer.
Si vous avez des données KEC2, KEC12, KEC312, alors l'ordre sera KEC12, KEC2, KEC312, qui n'est peut-être pas celui que vous voudriez avoir.


Message édité par olivthill le 27-12-2011 à 10:31:08
Reply

Marsh Posté le 27-12-2011 à 14:38:48    

Bonjour!
 
Comme mes connaissances ne sont pas très poussées avec tout ce qui est Mysql,
Voici le script que j'ai légèrement adapté (Suppression du système de page, suppression de l'ID du résultat qui permettait le tri avec Order By ID mais j'ai dû le supprimé car les résultats doivent se classer selon les codes et non les id des codes)
 

Code :
  1. <?
  2. include("head-debutcontenu.html" );        //header html
  3. ?>
  4. <span class="form">
  5.  <form action="index.php" method="post">
  6.  
  7.   <input type="text"  class="champ" size="20" name="mot">
  8.   <input type="submit" class="valider" name="valider" value="OK">
  9.  
  10.  </form>
  11. </span>
  12. <span class="resultat">
  13. <li><a>R&eacute;sultat</a></li>
  14. </span>
  15. <?
  16. // NBRE DE RESULTATS PAR PAGE
  17. $limit=50;
  18. // NOM DE CE SCRIPT
  19. $script_name="index.php";
  20. // SERVEUR SQL
  21. $sql_serveur="confidentiel";
  22. // LOGIN SQL
  23. $sql_user="confidentiel";
  24. // MOT DE PASSE SQL
  25. $sql_passwd="confidentiel";
  26. // BASE DE DONNEE
  27. $sql_bdd="confidentiel";
  28. // RECHERCHE AVEC TOUS LES MOTS METTEZ "and" RECHERCHER LES PAGES QUI CONTIENNENT AU MOINS UN MOT METTEZ "or"
  29. $et_ou="or";
  30. $db_link = mysql_connect("$sql_serveur","$sql_user","$sql_passwd" );
  31. if(isset($_POST["mot"])) $mot = $_POST["mot"];
  32. else $mot = "";
  33. $mots=split(" ",$mot);
  34. $mot=str_replace(' ','',$mot);
  35. $mot = ltrim($mot);
  36. $mot = rtrim($mot);
  37. $nombre_mots=count($mots);
  38. $z=1;
  39. $texte="R&eacute;sultats avec <b>$mots[0]</b> ";
  40. $phrase="'%$mots[0]%'";
  41. while($z<$nombre_mots)
  42. {
  43. $phrase.=" ".$et_ou." motcles like '%$mots[$z]%'";
  44. $texte.=" ";
  45. if($et_ou=="and" ){$texte.="et";}else{$texte.="ou";}
  46. $texte.=" <b>&quot;$mots[$z]&quot;</b>";
  47. $z++;
  48. }
  49. if($debut=="" ){$debut=0;}
  50. $debut=$page*$limit;
  51. // NOMBRE TOTAL D'ENREGISTREMENTS REPONDANT A LA REQUETE
  52. $requete=mysql_db_query("$sql_bdd","select count(*) from recherche where motcles like $phrase order by code",$db_link);
  53. $nb_total=mysql_result($requete,0,"count(*)" );
  54. $requete=mysql_db_query("$sql_bdd","select * from recherche where motcles like $phrase limit $debut,$limit",$db_link);
  55. $num=mysql_num_rows($requete);
  56. // DEFINITION DU MESSAGE A AFFICHER
  57. if ($mot=="" )  {echo "Entrez un mot cl&eacute;s";}
  58. else if ($num==0) {echo "$mot n'a pas renvoy&eacute; de code(s)";}
  59. // AFFICHAGE DES RESULTATS
  60. else {
  61. if ($nb_total>1) {echo "<b>$nb_total</b> $texte  :";}
  62. else
  63. {
  64. echo "1 $texte  :";
  65. }
  66. $i=0;
  67. while($i<$num)
  68. {
  69. $categorie=mysql_result($requete,$i,"categorie" );
  70. $autreinfocode=mysql_result($requete,$i,"autreinfocode" );
  71. $code=mysql_result($requete,$i,"code" );
  72. $description=mysql_result($requete,$i,"description" );
  73. echo <div class=\"resultat\"><a title=\"$autreinfocode\">$code</a><span class=\"categorie\">$categorie</span></br><span class=\"description\"><b>Description : </b>$description</span></div>\n";
  74. $i++;
  75. }
  76. echo "</br>";
  77. }
  78. // DECONNEXION DE LA BASE DE DONNEE
  79. mysql_close($db_link);
  80. include("pied-index.html" );
  81. ?>


 
(Désolé pour le pavé)
 
Et précision : les codes ont le même nombre de caractères donc cela devrait passer


Message édité par COCOOP le 27-12-2011 à 14:45:00
Reply

Marsh Posté le 28-12-2011 à 21:00:01    

Petit UP !

Reply

Marsh Posté le 29-12-2011 à 10:48:05    

La ligne du Select est intéressante.
Le reste du code n'est pas très utile pour le problème.
 
Mais surtout, il manque des exemples de :
- données en base
- données retournées actuellement
- données qu'il faudrait que la requête retourne.
Il suffirait de donner juste quelques lignes, pour qu'on comprenne bien le problème, parce que là, pour moi personnellement, la question n'est pas encore très claire, et c'est peut-être le cas pour d'autres personnes c, ce qui expliquerait l'absence de réponse.
 
Quoi qu'il en soit, je ne vois pas l'intérêt de mettre le "order by..." dans la requête du "select count(*)...". Je pense qu'il faudrait plutôt mettre le "order by..." dans la requête du "select *..."

Reply

Marsh Posté le 03-01-2012 à 11:52:28    

COCOOP a écrit :

Salut!
... 4 lettres puis 3 chiffres (Ex : KEC012) dans un colonne nommée Code  


 
je vois pas 4 lettres dans ton exemple moi.
 
sinon pour prendre le pb dans un autre sens, une recherche normalement ca se trie par pertinence.
pour ca il y a "match against"
 
http://dev.mysql.com/doc/refman/5. [...] earch.html => recherche fullltext
http://dev.mysql.com/doc/refman/5. [...] olean.html => recherche mode boolean (et/ou/non...)
 


---------------
[VDS] rail vesa, bras ecran, support TV / [ACH] des machins
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed