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 :

Lecture d'une table avec requête ordonnée et groupée [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre éprouvé
    Homme Profil pro
    Touche à tout informatique autodidacte
    Inscrit en
    Janvier 2007
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Touche à tout informatique autodidacte

    Informations forums :
    Inscription : Janvier 2007
    Messages : 808
    Points : 912
    Points
    912
    Par défaut Lecture d'une table avec requête ordonnée et groupée
    Bonjour,
    Comme à mon habitude, difficile de trouver comment titrer.

    Je cale sur un problème que je me suis créé.
    J'ai une table MySql (4) que je parcrours avec Php (4).
    Id, Nom, Prenom, Age

    En admettant qu'elle soit remplie de cette façon
    1,Dupond,Robert,42
    2,Finand,Maxime,40
    3,Brise,Christian,39
    4,Dupond,Joelle,40
    5,Bruel,Jacques,42
    6,Filleul,Paul,38
    Je voudrais pouvoir les afficher de cette façon


    Gens de 38
    Filleul Paul
    ****************

    Gens de 39
    Brise Christian
    ****************

    Gens de 40
    Finand Maxime
    Dupond Joelle
    ****************

    Gens de 42
    Dupond Robert
    Bruel Jacques
    ****************
    Après avoir cogité bien des heures, la seule façon que j'ai trouvé :

    Une boucle Compteur = 38 à 42
    Ecrire Gens de Compteur
    Boucle de lecture et d'affichage des enregistrements ordonnés par Id avec Age = Compteur
    Ecrire ****************
    Fin de la boucle

    Je me demandais s'il était possible de simplifier avec un group by ou join ou autre façon (qui me paraissent toute bizarres, vu que je n'en ai pas compris le fonctionement) le traitement de façon à ne pas trop solliciter le serveur MySql.

  2. #2
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 35
    Points : 34
    Points
    34
    Par défaut
    Si tu veux affiché par âge croissant il te suffit de mettre à la suite de ta requête ORDER BY Age ASC et pour décroissant ORDER BY Age DESC.

    De se fait tes résultat apparaitrons dans l'ordre croissant et il ne te reste plus qu'à faire la mise en page que tu veux.

    Exemple concret:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $requete = "SELECT Id, Nom, Prenom, Age FROM personne ORDER BY Age ASC";
     
    $result = mysql_query($requete);
     
    print_r($result);

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 50
    Points : 54
    Points
    54
    Par défaut
    Il faut également rajouter à la requete "GROUP BY Age "entre Personne et ORDER BY. Comme cela ils seront regroupés selon l'âge.

  4. #4
    Membre éprouvé
    Homme Profil pro
    Touche à tout informatique autodidacte
    Inscrit en
    Janvier 2007
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Touche à tout informatique autodidacte

    Informations forums :
    Inscription : Janvier 2007
    Messages : 808
    Points : 912
    Points
    912
    Par défaut
    Bonjour,

    Je m'excuse de ne pas avoir précise que j'ai l'habitude de programmer en Php et Mysql. Ce que vous deux avez été gentils de me proposer, je le savais déjà.
    Mon souci c'est que je veux pouvoir afficher les enregistrements groupés par âge.
    D'ailleurs, je ne savais pas que print_r pouvait m'afficher le résultat de mysql_query, je pensais que son résultat était une ressource.

  5. #5
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 35
    Points : 34
    Points
    34
    Par défaut
    Oui excuse moi. Erreur de ma part mysql_query(); retourne bien une ressource . Donc oui print_r n'a pas sa place ici.

    Si j'ai bien compris tu veux affiché les personnes par âge donc toutes les personnes ayant 38ans ensemble, 39ans ensemble, ...

    Donc tu peux faire ta requête une seule fois. Après le mieux peut-être l'âge du plus petit au plus grand. Du coups si l'âge précédent et différent de l'âge suivant alors tu changes de groupe.

  6. #6
    Membre éprouvé
    Homme Profil pro
    Touche à tout informatique autodidacte
    Inscrit en
    Janvier 2007
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Touche à tout informatique autodidacte

    Informations forums :
    Inscription : Janvier 2007
    Messages : 808
    Points : 912
    Points
    912
    Par défaut
    Bonjour,
    Webinfo, j'ai bien pensé à celà. Le hic c'est que je suis saturé (mes neurones disjonctent) et qu'il est nécessaire de :
    1. Afficher l'entête du groupe au début
    2. Afficher une fin avant d'aborder le prochain groupe.

    En fait, je voulais faire simple dans ma description. La réalité est que je gère ma page avec des <DIV> et que chaque groupe sera dans son propre bloc <DIV> à cet exemple :

    <div class="groupe">
    <div class="entete>Gens de 38</div>
    <p>Filleul Paul</p>
    <div class="bas">****************</div>
    </div>

    <div class="groupe">
    <div class="entete>Gens de 39</div>
    <p>Brise Christian</p>
    <div class="bas">****************</div>
    </div>

    <div class="groupe">
    <div class="entete>Gens de 40</div>
    <p>Finand Maxime</p>
    <p>Dupond Joelle</p>
    <div class="bas">****************</div>
    </div>


    <div class="groupe">
    <div class="entete>Gens de 42</div>
    <p>Dupond Robert</p>
    <p>Bruel Jacques</p>
    <div class="bas">****************</div>
    </div>
    J'espère que cette fois que ma requête est claire.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 50
    Points : 54
    Points
    54
    Par défaut
    Desole pour la mesentente!

    Dans ton cas il faudrait faire une chtite boucle de ce genre :

    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
    27
    28
     
    $sql = "SELECT MIN(AGE) FROM Personne";
    $ret = mysql_query($sql);
    $don = mysql_fetch_array($ret)
    $tmp = $don['age'];
     
    echo '<div class="groupe">
            <div class="entete>Gens de '.$don['age'].'</div>'; //On ouvre le premier groupe
     
    $sql2 = "SELECT * FROM Personne ORDER BY AGE ASC";
    $ret2 = mysql_query($sql2);
     
    while ($don2 = mysql_fetch_array($ret2))
    {
       if($tmp== $don2['age']) // Si on est toujours dans le meme age
       {
          echo '<p>'.$don2['nom'].'</p>';    
       }
       else
       {
          $tmp = $don2['age'];
          echo '<div class="bas">****************</div>
                  </div>'; // On ferme le groupe
          echo '<div class="groupe"> // On ouvre le prochain
                  <div class="entete>Gens de '.$don2['age'].'</div>';
          echo '<p>'.$don2['nom'].'</p>';
       }
    }
    En fait tu recuperer l'age minimal en ecrivant le premier div par la meme occasionant et ensuite tu fais ta boucle.

    Cet algo est assez bourrin () mais je pense que ca pourrait fonctionner.

  8. #8
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 35
    Points : 34
    Points
    34
    Par défaut
    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
    27
    28
    29
    30
     
    // Partie qui récupère les résultats contenu dans la table
    $requete = "SELECT Id, Nom, Prenom, Age FROM personne ORDER BY Age ASC"; 
    $result = mysql_query($requete) or die(mysql_error()); 
     
    // Partie qui traitent et affiche les résultats
    while($data[] = mysql_fetch_assoc($result)); // Stock tous les données des champs récupéré par la requête
     
    $indice = 0; // 1er indice qui correspond à l'ID
     
    echo '<div class="groupe">';
     
    while($data[$indice] != NULL) // Tant qu'il y a des données
    {
         if($data[$indice-1] != $data[$indice+3]) // Si l'âge actuel est différent du précédent
         {
               if($indice != 0) // Si ce n'est pas le 1er affichage (évite les * au tout début)
                    echo '      <div class="bas">****************</div>';
     
               echo' </div>
                       <div class="groupe">
                             <div class="entete>Gens de '.$data[$indice+3].'</div>';
         }
         echo '<p>'.$data[$indice+1].' '.$data[$indice+2].'</p>';
     
        $indice += 4;    
    }
     
    echo '     <div class="bas">****************</div>
            </div>';
    Voilà a peut près le code à faire il y a mieux c'est sur mais il y a pire aussi ^^.

  9. #9
    Membre éprouvé
    Homme Profil pro
    Touche à tout informatique autodidacte
    Inscrit en
    Janvier 2007
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Touche à tout informatique autodidacte

    Informations forums :
    Inscription : Janvier 2007
    Messages : 808
    Points : 912
    Points
    912
    Par défaut
    Bonjour,
    Merci, c'était la solution que j'avais préconisé.

    Ce qui me dérange c'est les tests à faire pour détecter les catégories d'âge.

    J'attends de mettre résolu pour voir s'il n'y a pas d'autres olution.

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

Discussions similaires

  1. lecture d'une table avec boucle + variable à alimenter et à réinitialiser
    Par paris11 dans le forum Développement de jobs
    Réponses: 5
    Dernier message: 22/05/2014, 16h14
  2. [Débutant] Lecture d'une table avec un GridView
    Par Afaf001 dans le forum ASP.NET
    Réponses: 3
    Dernier message: 13/08/2013, 22h27
  3. [Débutant] Lecture d'une table avec un GridView
    Par Afaf001 dans le forum VB.NET
    Réponses: 0
    Dernier message: 12/08/2013, 12h45
  4. Remplissage d'une table avec requête ODBC
    Par Marc_27 dans le forum VBA Access
    Réponses: 5
    Dernier message: 19/11/2009, 14h19
  5. Tester l'existence d'une table avec une requête
    Par Oluha dans le forum Access
    Réponses: 6
    Dernier message: 29/08/2005, 09h45

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