IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

MySql tri par ordre qui ne marche pas [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Invité
    Invité(e)
    Par défaut MySql tri par ordre qui ne marche pas
    Bonjour,
    Comme je ne veut rien qu'i manque je vous donnes
    ma table "cm2" ET ma requéte

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    DROP TABLE IF EXISTS `cm2`;
    CREATE TABLE IF NOT EXISTS `cm2` (
      `LId` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
      `Letxt1` varchar(10)  NOT NULL DEFAULT '',
      `Letxt2` varchar(40) NOT NULL DEFAULT '',
      `LeleveNum` mediumint(8) unsigned NOT NULL DEFAULT '0',
      `LeleveNom` varchar(25) NOT NULL DEFAULT '',
      `sujet` varchar(80) NOT NULL DEFAULT '',
      `LTexte` longtext NOT NULL,
      PRIMARY KEY (`LId`),
      KEY `Letxt1` (`Letxt1`),
      KEY `LeleveNum` (`LeleveNum`),
      KEY `txt_12` (`Letxt1`,`Letxt2`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    //======= la connection est faite
    //======= $lui="jean" donc tout les jean ============== 
     
    $result=mysql_query( "select * from cm2
             WHERE  Letxt1 LIKE '$Lui%'
             ORDER BY txt_12 DESC ");
        while ($row=mysql_fetch_array($result)) 
         {
          echo $row[Letxt1];
         }
    Cette requéte me donne une erreur sur le while ... (trouve rien)
    Si je fais mon tri (ORDER BY) sur une valeur autre le résultat est parfait !

    Une idée ? merci d'avance.
    Dernière modification par Invité ; 17/06/2010 à 16h22.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 450
    Par défaut
    essaie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $result=mysql_query( "select * from cm2 WHERE  Letxt1 LIKE '%$Lui%' ORDER BY txt_12 DESC ");
     
        while ($row=mysql_fetch_array($result)) 
           {
            echo $row['Letxt1'];
           }
    Dis moi si sa marche

    Sinon fait comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    // requete principale
    $requete="SELECT * FROM cm2 WHERE  Letxt1 LIKE '$Lui%";
     
    // Complement requete
    $complement_requete="ORDER BY txt_12 DESC";
     
    // Compte le nombre de résultats
    $compte=mysql_num_rows($requete);
     
    //requete entiere pour la chaine while
    $req=mysql_query( "$requete $complement_requete");
     
      if ($compte)
       {
        //Si la requete retourne des resultats on fait la boucle d' affichage
        while ($row=mysql_fetch_array($req)) 
         {
          echo $row['Letxt1'];
         }
        }
       else
        {
    // Sinon, on dit qu'il n'y a pas de resultats
        echo 'Pas de resultats';
        }
    Voili voilou, normalement sa devrait éviter le message d' erreur

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci de ta réponse.
    En premier le LIKE '%$Lui%' ne me sert pas puisque $Lui (dans mon cas) est obligatoir en tête.

    Deuxiéme point j'ai dis que si je fais order by LeleveNom ça marche bien sans erreurs, et je n'ais bien que ceux qui commencent par $Lui.

    Troisiemme point, DONC il semblerait que ORDER BY une clée composée marche pas alors a quoi ça sert ?

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 70
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 316
    Par défaut
    bonjour,
    question toute bête : quelles valeurs sont dans ta clé composée?
    donnes quelques enregistrements de ta table.

  5. #5
    Invité
    Invité(e)
    Par défaut
    1, 'pierre 1256','adurin 9452',125,'pierre leluc',bac 1er année'
    1, 'jean 1256','adurin 8852',125,'jean lavaliere',bac redouble'

    Je ne sais pas la valeur de ma clé composée, mais normalement

    'pierre 1256adurin 9452'
    'jean 1256adurin 8852'

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 70
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 316
    Par défaut
    j'ai créé ta table
    CREATE TABLE cm2 (
    LId mediumint(8) unsigned NOT NULL auto_increment,
    Letxt1 varchar(10) NOT NULL default '',
    Letxt2 varchar(40) NOT NULL default '',
    LeleveNum mediumint(8) unsigned NOT NULL default '0',
    LeleveNom varchar(25) NOT NULL default '',
    sujet varchar(80) NOT NULL default '',
    LTexte longtext NOT NULL,
    PRIMARY KEY (LId),
    KEY Letxt1 (Letxt1),
    KEY LeleveNum (LeleveNum),
    KEY txt_12 (Letxt1,Letxt2)
    ) TYPE=MyISAM;
    j'ai inséré des enregistrements
    INSERT INTO cm2 VALUES (1,'pierre1256','adurin 9252',125,'leduc','','');
    INSERT INTO cm2 VALUES (2,'jean 1256','adurin8525',125,'lolo','','');
    j'ai essayé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <?php
    require("connect.php");
    OuvrirBase();
    $lui="jean";
    $req="select * from cm2 WHERE Letxt1 LIKE '$lui%' ORDER BY txt_12 DESC ";
    $res=mysql_query($req) or die ("message d'erreur: ".mysql_error());
    //print_r(mysql_fetch_array($res));
    while($ra=mysql_fetch_array($res)){
    print("$ra[0]<br />$ra[1]<br />$ra[2]<br />$ra[3]<br />$ra[4]<br />$ra[5]<br />$ra[6]<br />$ra[7]<br />-----<br />");
    }
    FermerBase();
    ?>
    réponse:
    message d'erreur: Champ 'txt_12' inconnu dans order clause

  7. #7
    Invité
    Invité(e)
    Par défaut
    Merci pour tout ce travail !
    donc ça semble prouver qu'il ne permets pas le tri sur une cle composite !
    vraiment j'espére qu'un de nos Maître va passer par là

  8. #8
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Salut

    A mon avis, il ne faut pas mettre les noms des INDEX (car ce sont des index) dans le ODER BY, mais uniquement ceux des champs.

    Donc si tu veux faire un tri sur les 2 champs qui composent l'index, et bien mets ces 2 champs :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT *
    FROM cm2
    WHERE
    Letxt1 LIKE '%$Lui%'
    ORDER BY Letxt1 DESC, Letxt2 DESC
    Les INDEX sont essentiellement fait pour optimiser une table, une Bdd, ce ne sont pas des champs.
    Enfin, sauf erreur.

  9. #9
    Invité
    Invité(e)
    Par défaut
    trés bon plan, je teste cela , merci.
    Mais tu m'avoueras que ça ne sert a rien de définir une telle clé !
    Dernière modification par Invité ; 17/06/2010 à 16h24.

  10. #10
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Citation Envoyé par mauriser
    Mais tu m'avoeras que ça ne sert a rien de définir une telle clé !
    Si tu l'as fait, c'est qu'il y avait une raison, non ?
    Tu pourrait expliquer la raison.

    Là comme ça, j'en sais rien, mais j'ai l'impression que ce serait plutôt un FULLTEXT.
    Par contre, je remarque que leur contenu est très minime, donc ça deviendrait sur-dimensionné.
    La doc sur le FULLTEXT, peut être y trouveras tu des infos utiles :
    -> http://dev.mysql.com/doc/refman/5.0/...xt-search.html

  11. #11
    Invité
    Invité(e)
    Par défaut
    Désolée, l'ami, mais la n'est pas la question,
    bien sur j'ais donné un test enfantin, loin de la réalitée, pour ne pas embrouiller la vrais question.

    La vrais question restant:
    A quoi servent ces clés composites si on ne peut pas faire de tri dessus
    Je t'assures avoir des bases assez fortes sans prétention,
    Mais sur ce point précis je séches lamentablement.

    Encore merci a toi

  12. #12
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Citation Envoyé par mauriser
    A quoi servent ces clés composites si on ne peut pas faire de tri dessus
    Je t'assures avoir des bases assez fortes sans prétention,
    Mais sur ce point précis je séches lamentablement.
    Et bien pas pour ça, par pour des tri, car ce ne sont pas des champs.
    Je ne vois pas comment dire autrement.

    Vu qu'un index c'est soit 1 champ ou plusieurs champs, en quoi trouve tu d'étrange à renseigner le nom des champs qui compose l'index dans le ORDER BY ?

    Ca n'a rien avoir, car c'est MySQL qui va justement retrouver les lignes plus rapidement grâce aux index que tu auras défini, à commencer par la clé primaire, peu importe l'ordre que tu feras après.


    Si tu as défini un index dans le seul but de faire des tries dessus, alors c'est à mon avis une mauvaise raison.
    Enfin, sauf erreur.


    Tu ne dis pas cependant ce que représente ta clé composite, est-ce un FULLTEXT ou pas, un simple index, une clé ?


    Ceci dit, il devrait être possible de mettre un alias sur ces 2 champs (l'index), et exploiter cet alias dans le ORDER BY.

  13. #13
    Invité
    Invité(e)
    Par défaut
    Merci ,
    C' est bien plus clair ainsi , j'ais donc l'explication plus la méthode en prime
    Voila je mets résolu.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [2008R2] Compression sauvegarde par défaut qui ne marche pas !
    Par JauB dans le forum Administration
    Réponses: 9
    Dernier message: 27/02/2014, 08h04
  2. [XL-2007] Tri par ordre alphabétique ne fonctionne pas
    Par dmoluc dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 11/04/2013, 09h32
  3. Réponses: 2
    Dernier message: 14/02/2008, 19h31
  4. Tri et pagination du datagrid qui ne marche pas
    Par paradeofphp dans le forum ASP.NET
    Réponses: 2
    Dernier message: 30/05/2007, 17h00
  5. [php-mysql] requête qui ne marche pas....
    Par sanosuke85 dans le forum Requêtes
    Réponses: 1
    Dernier message: 09/01/2006, 17h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo