Partage
  • Partager sur Facebook
  • Partager sur Twitter

GROUP BY n'affiche qu'une seule ligne par requête

Je ne savais pas quel titre mettre.

Sujet résolu
    2 mars 2021 à 1:08:46

    Bonjour, pour la liste des mises à jour de mon site, j'utilise une base de données pour les afficher.

    Le problème est lorsque je fais un GROUP BY et qu'il y a eu plusieurs mises à jour le même jour, ça en affiche un seul.

    Comment faire pour afficher toutes les mises à jour pour chaque jour ?

    $RecupListeVersions = $bdd->prepare("SELECT numero, texte, date FROM version_list GROUP BY date ORDER BY id DESC");
    $RecupListeVersions->execute();
    while ($version = $RecupListeVersions->fetch(PDO::FETCH_OBJ)) 
    {
    echo '<h5>'.$version->date.'</h5>
    <br>
    <ul class="list-group">
        <li class="list-group-item"><b>'.$version->numero.': </b>'.$version->texte.'</li>
    </ul>
    <hr>';
    }

    • Partager sur Facebook
    • Partager sur Twitter
      2 mars 2021 à 7:53:48

      Ne pas confondre group by et order by

      Le premier donne un résultat par groupe.

      -
      Edité par michelbillaud 2 mars 2021 à 7:54:42

      • Partager sur Facebook
      • Partager sur Twitter
        2 mars 2021 à 10:16:43

        michelbillaud a écrit:

        Ne pas confondre group by et order by

        Le premier donne un résultat par groupe.

        -
        Edité par michelbillaud il y a environ 1 heure


        Non, mais tu n'as pas compris.
        Je veux faire un GROUP BY justement, le problème est que ça n'affiche qu'une seule des mises à jour à chaque fois.
        • Partager sur Facebook
        • Partager sur Twitter
          2 mars 2021 à 10:27:23

          Tu veux faire un GROUP BY, mais

          1) tu fais aussi un order by

          SELECT numero, texte, date FROM version_list

               GROUP BY date

               ORDER BY id DESC

          2) ce n'est pas parce que tu veux faire un GROUP BY que c'est ça qu'il faut faire pour résoudre ton problème ).

          Ici le GROUP BY retient un seul numéro et texte par date. Ce qui est exactement le symptôme que tu décrit

          > le problème est que ça n'affiche qu'une seule des mises à jour à chaque fois.


          Si tu disais ce que ça devrait afficher, ça aiderait à voir la requête qu'il faut écrire.  Mais si ton but c'est de mettre un GROUP BY, on va pas essayer de t'en empêcher. Après faut juste pas s'étonner que ça groupe.



          -
          Edité par michelbillaud 2 mars 2021 à 10:30:12

          • Partager sur Facebook
          • Partager sur Twitter
            2 mars 2021 à 12:03:27

            En gros ce que je veux faire, c’est ça :

            Et la le problème, c’est que par exemple, ça affiche :

            02 Mars :

            version 0.7

            01 Mars : 

            version 0.3

            28 Février :

            version 0.2

            Alors que j’aimerais que ça affiche toutes les versions intermédiaire 

            -
            Edité par ToinouPHP 2 mars 2021 à 12:04:47

            • Partager sur Facebook
            • Partager sur Twitter
              2 mars 2021 à 12:09:18

              C'est ce que je dis depuis le début : avec un group by date, ça produit une ligne unique par date.

              Donc ce qu'on veut, c'est un résultat par enregistrement de la table.

              Solution

              • Ordonner par date, puis par numéro de version. Décroissants, les deux.
              • Ensuite, parcours séquentiel, avec un petit traitement pour afficher la date quand on détecte qu'elle a changé.
              Alternative :
              • boucle sur les dates (select unique date from ....)
              • pour chaque date, affichage de la date et recherche + affichage des enregistrements concernés.
               Ah tiens, y a pas de group by.

              -
              Edité par michelbillaud 2 mars 2021 à 12:15:17

              • Partager sur Facebook
              • Partager sur Twitter
                2 mars 2021 à 12:15:33

                Ah.

                Pour le coup, je ne suis pas certain de savoir comment procéder pour le parcours séquentiel 😄

                Merci !

                • Partager sur Facebook
                • Partager sur Twitter
                  2 mars 2021 à 12:20:05

                  Je suppose que c'est un exercice, c'est donc une bonne chose de chercher.

                  -
                  Edité par michelbillaud 2 mars 2021 à 12:20:39

                  • Partager sur Facebook
                  • Partager sur Twitter
                    2 mars 2021 à 12:50:33

                    Salut

                    Un algorithme exposé pour faire ce que tu souhaites se trouve notamment ici.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      2 mars 2021 à 13:05:01

                      voir comment comparer avec la date de l'enregistrement, ça devrait pas lui causer de dommage cérébral trop important.

                      date courante = date bidon
                      pour  tout enregistrement {
                          si date de l'enregistrement != date courante {
                              afficher la date
                              mettre à jour la date courante
                          }
                          afficher l'enregistrement
                      }
                      



                      -
                      Edité par michelbillaud 2 mars 2021 à 13:06:57

                      • Partager sur Facebook
                      • Partager sur Twitter
                        2 mars 2021 à 14:11:02

                        Effectivement un while dans un while était la bonne solution.

                        Merci ! 

                        $RecupListeVersions = $bdd->prepare("SELECT numero, texte, date FROM version_list GROUP BY date ORDER BY id DESC");
                        $RecupListeVersions->execute();
                        while ($version = $RecupListeVersions->fetch(PDO::FETCH_OBJ)) 
                        {
                        $date = $version->date;
                        $RecupListeVersions2 = $bdd->prepare("SELECT numero, texte, date FROM version_list WHERE date = '$date' ORDER BY id DESC");
                        $RecupListeVersions2->execute();
                        
                        echo '<h5>'.$version->date.'</h5>
                        <br>';
                        while ($version2 = $RecupListeVersions2->fetch(PDO::FETCH_OBJ)) 
                        {
                            echo '<ul class="list-group">
                            <li class="list-group-item"><b>'.$version2->numero.': </b>'.$version2->texte.'</li>
                        </ul>';
                        }
                        
                        echo '<hr>';
                        }



                        • Partager sur Facebook
                        • Partager sur Twitter
                          2 mars 2021 à 14:13:41

                          ça marche mais c'est (nettement) moins efficace, à cause de la recherche par sur la date, qui n'est (probablement) pas indexée.

                          • Partager sur Facebook
                          • Partager sur Twitter
                            2 mars 2021 à 14:30:21

                            Ce qui est intéressant, c'est que tu n'as pas pris l'entier du sujet mais uniquement le premier message. Sachant qu'il y a un vrai algorithme complet et optimal, avec des explications, à la fin du sujet, et que le lien n'était même pas sur le premier message spécifiquement…

                            Je t'enjoins à reprendre donc le sujet que j'ai fourni dans son entièreté. Parce que la solution que tu as mise en place n'est pas optimale et était la raison pour l'ouverture de l'autre sujet, et non sa solution (sans quoi il n'y aurait pas eu de discussion).

                            • Partager sur Facebook
                            • Partager sur Twitter

                            GROUP BY n'affiche qu'une seule ligne par requête

                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                            • Editeur
                            • Markdown