Partage
  • Partager sur Facebook
  • Partager sur Twitter

Jointure commentaire et article

Sujet résolu
    3 août 2020 à 15:08:06

    Salut tout le monde!

    Voilà j'ai mon petit bout de code qui me permet de récupérer les commentaires d'un article.

    Le but est donc d'afficher l'article une fois et d'afficher les 3 derniers commentaires de l'article... problème actuel il m'affiche autant de fois l'article qu'il y a de commentaires /:

    $list_article = "SELECT * FROM post LEFT JOIN commentaires ON post.post_id = commentaires.post_id ";
    $list_article = $bdd->prepare($list_article);
    $list_article->execute(); 
    
    while($article = $list_article->fetch(PDO::FETCH_ASSOC)){
    echo '<article>'.$article['post_autheur].'</article>';
    }



    • Partager sur Facebook
    • Partager sur Twitter
      3 août 2020 à 15:41:02

      Salut

      C'est normal. Tu demandes de sélectionner toutes les colonnes des deux tables post et commentaires (au passage, pourquoi une au pluriel et pas l'autre ?). Comme il y a possiblement plusieurs commentaires pour un post, on te retourne chaque commentaire avec les informations du post qui lui est lié. A toi de n'afficher que les colonnes qui te sont nécessaires là où tu en as besoin.

      Tu tombes dans ce cas d'école où ses films sont tes posts et ses acteurs tes commentaires. Avec la petite différence que tu souhaites limiter à 3 les commentaires affichés.

      • Partager sur Facebook
      • Partager sur Twitter
        4 août 2020 à 9:47:21

        Bonjour,

        Désolé je ne me retrouve pas dans le "cas d'école"... peut etre encore un peu de mal.

        Le but est donc de:

        - récupérer le nombre de commentaires par post

        - affiché les commentaires selon le post

        - listé la totalité de post

        J'ai donc tenté une JOINTURE :

        SELECT post.post_id AS post_id, post_type, post_texte, post_autheur, commentaire_pseudo, post_date,
        COUNT(post.post_id)
        AS nb_coms
        FROM post
        LEFT JOIN commentaires c ON post.post_id = c.post_id GROUP BY post.post_id 

        J'ai bien le bon nombre de commentaire selon les post.

        J'ai bien la totalité des post

        Mais je n'ai que 1 seul commentaire par post alors qu'il y en a plusieurs.....

        -
        Edité par AlyciaTerre 4 août 2020 à 10:51:12

        • Partager sur Facebook
        • Partager sur Twitter
          4 août 2020 à 11:45:45

          Ta requête compte les post, pas les commentaires  ;)

          Mais même en changeant ça, tu vas te retrouver avec un seul commentaire arbitraire pour chaque post. Je n'ai pas testé, mais il pourrait être possible de faire deux jointures sur commentaires. L'une ne sert qu'à les compter et à regrouper (on va ainsi utiliser l'ID du post dans la table commentaires plutôt que l'ID du post en lui-même, ça devrait bien récupérer uniquement ce que l'on cherche), l'autre servira à les récupérer.

          SELECT
                  post.post_id AS post_id,
                  post_type,
                  post_texte,
                  post_autheur,
                  c.commentaire_pseudo,
                  post_date,
                  COUNT(DISTINCT c2.commentaires_id) AS nb_coms
              FROM
                          post
                  LEFT JOIN
                          commentaires c
                      ON
                              post.post_id = c.post_id
                  LEFT JOIN
                          commentaires c2
                      ON
                              post.post_id = c2.post_id
              GROUP BY
                  c2.post_id
              ORDER BY
                  c.commentaires_id DESC

          Pour le coup, je ne sais pas trop comment limiter le nombre de commentaires liés, il n'y a à ma connaissance pas moyen de le faire en une seule requête sans imbrication, et je ne suis pas assez à l'aise pour voir si et comment ça se passerait. Si cette requête fonctionne, ce sera à toi de limiter lors de l'affichage à 3 commentaires par post.

          Mais tu vas continuer à récupérer autant de fois un post qu'il a de commentaires. Si tu lances ta requête dans phpMyAdmin, ce sera pareil.

          -
          Edité par Ymox 4 août 2020 à 11:48:49

          • Partager sur Facebook
          • Partager sur Twitter
            4 août 2020 à 11:51:25

            Re, merci pour l'investissement et la prise de temps.

            Alors après avoir testé la requete et corrigé les champ enfait je me retrouve exactement avec la même chose que ma requete.

            Je n'ai que un seul commentaire affiché par post...

            • Partager sur Facebook
            • Partager sur Twitter
              4 août 2020 à 11:52:43

              Quelle requête as-tu effectuée exactement ?

              En ajoutant un regroupement sur c.commentaires_id, je pense que c'est déjà mieux  ;)

              SELECT
                      post.post_id AS post_id,
                      post_type,
                      post_texte,
                      post_autheur,
                      c.commentaire_pseudo,
                      post_date,
                      COUNT(c2.commentaires_id) AS nb_coms
                  FROM
                              post
                      LEFT JOIN
                              commentaires c
                          ON
                                  post.post_id = c.post_id
                      LEFT JOIN
                              commentaires c2
                          ON
                                  post.post_id = c2.post_id
                  GROUP BY
                      c2.post_id,
                      c.commentaires_id
                  ORDER BY
                      c.commentaires_id DESC

              Autrement, je pense que tu vas devoir passer par deux requêtes, une qui compte et une qui sélectionne.

              -
              Edité par Ymox 4 août 2020 à 12:14:16

              • Partager sur Facebook
              • Partager sur Twitter
                4 août 2020 à 13:15:18

                lol

                C'est de la requete ça.

                Bon effectivement le problème est que j'ai autant de post qu'il y a de commentaires.

                Les 2 requetes semble inévitables

                • Partager sur Facebook
                • Partager sur Twitter
                  4 août 2020 à 13:22:26

                  Une fois de plus, ça, même si tu trouvais comment limiter à 3 commentaires par post, tu aurais trois fois le même post avec la jointure : c'est normal. Tu ne peux pas faire autrement avec une jointure.

                  De plus, tu ne pourras probablement pas non-plus n'avoir que maximum 3 commentaires par post pour tous les posts en une seule requête, ça risque d'être une requête par message.

                  Je reviens donc à la charge : les affichages divers pour éviter les doublons et limiter le nombre de commentaires, en l'état, c'est à faire dans le PHP.

                  -
                  Edité par Ymox 4 août 2020 à 13:24:16

                  • Partager sur Facebook
                  • Partager sur Twitter
                    4 août 2020 à 13:31:11

                    alors excuse moi mais je n'ai pas bien compris ce que tu souhaites dire.

                    Il serait mieux de faire un foreach par exemple ?

                    • Partager sur Facebook
                    • Partager sur Twitter
                      4 août 2020 à 13:35:21

                      Non, je ne recommande pas de foreach avec fetchAll, while et fetch fonctionnent très bien dans ce cas aussi.

                      Si tu reprends le sujet que j'ai lié dans mon premier message, il y a ce qu'il te faut adapter. Si le nombre de commentaires te gêne, imagine que c'est comme une information de la table post. Le reste, l'algorithme est le même, à toi d'adapter pour les colonnes que tu souhaites afficher ou pas. La différence est que dès que tu auras affiché 3 commentaires par post, tu devras passer les résultats jusqu'au post suivant.

                      -
                      Edité par Ymox 4 août 2020 à 13:35:48

                      • Partager sur Facebook
                      • Partager sur Twitter
                        4 août 2020 à 13:52:44

                        Je vais relire mais sinon j'ai fait une double requete, la première me permet d'avoir la liste de tous les post et le nombre de commentaires de chacun d'eux

                        et la deuxième récupéres les commentaires

                        Par contre je n'ai qu'un seul commentaire.

                        le problème vient que j'affiche les commentaire dans la boucle du post mais je ne vois pas comment faire sinon.

                        Je vous donne le code de ma boucle:

                        <?php
                        // Post
                                    $list_article = 'SELECT post.post_id AS post_id, post_type, post_texte, post_autheur, commentaire_pseudo, post_date, commentaire_pseudo,commentaire_text,  COUNT(post.post_id) AS nb_coms FROM post LEFT JOIN commentaires c ON post.post_id = c.post_id GROUP BY post.post_id';
                                    $list_article = $bdd->prepare($list_article);
                                    $list_article->execute();
                        
                        
                                    // commentaire
                                    $list_comm = $bdd->prepare("SELECT  post_id, commentaire_pseudo,commentaire_text FROM commentaires");
                                    $list_comm->execute();
                                    $row = $list_comm->fetch(PDO::FETCH_ASSOC);
                        
                          
                        
                                      while($article = $list_article->fetch(PDO::FETCH_ASSOC)){ 
                        
                                        echo '<div class="widget-box-status">
                                    <div class="widget-box-status-content">
                                      <div class="user-status">
                                        <a class="user-status-avatar" href="profile-timeline.html">
                                          <img class="img-fluid" src="https://images-na.ssl-images-amazon.com/images/I/71YclaqRiLL._AC_SY741_.jpg">
                                        </a>
                        
                                        <p class="user-status-title medium"><a class="bold" href="profile-timeline.html">'.$article['post_autheur'].'</a> xstory <span class="bold">24 nouvelles photos</span></p>
                                        <p class="user-status-text small">Il y a 17 minutes</p>
                                      </div>
                         
                                      <p class="widget-box-status-text">'.$article['post_texte'].'</p>
                                    </div>
                           
                           
                                    <div class="iframe-wrap">
                                      <iframe width="1280" height="720" src="https://www.youtube.com/embed/nlcIKh6sBtc?list=RDnlcIKh6sBtc" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
                                    </div>
                        
                        
                        
                                    <div class="widget-box-status-content">
                                      <div class="content-actions">
                                        <div class="content-action">
                                          <div class="meta-line">
                                            <div class="meta-line-list reaction-item-list">
                                              <div class="reaction-item" style="position: relative;">
                                                <img class="reaction-image reaction-item-dropdown-trigger" src="img/reaction/love.png" alt="reaction-love">
                                              </div>
                                            </div>
                                          </div>
                        
                                          <div class="meta-line">
                                            <p class="meta-line-text">1.256k Vues</p>
                                        
                                          </div>
                        
                                        </div>
                        
                                        <div class="content-action" id="click-to-show">
                                          <div class="meta-line">
                                            <p class="meta-line-link">
                                            <svg class="post-option-icon icon-comment"><use xlink:href="#svg-comment"></use></svg> '.$article['nb_coms'].'
                                            </p>
                                          </div>
                                        </div>
                                      </div>
                        
                         
                                <div class="quick-post">
                                '.$row['commentaire_pseudo'].'
                                
                                  <div class="quick-post-body">
                                     <form class="form" method="post">
                                      <div class="form-row">
                                        <div class="form-item">
                                          <div class="form-textarea">
                                            <input type="hidden" name="num_post" value="'.$article['post_id'].'">
                                            <textarea id="quick-post-text" name="commentaire_text" placeholder="Une réaction à cette vidéo ?"></textarea>
                                          </div>
                                        </div>
                                      </div>
                                  </div>
                              
                                  <div class="quick-post-footer">
                                      <div class="quick-post-footer-actions">
                                         <input type="submit" class="button small secondary" name="send_commentaire" value="Publier">
                                      </div>
                                  </div>
                                   </form>
                                </div></div></div>';   
                                    }
                                  ?>



                        • Partager sur Facebook
                        • Partager sur Twitter
                          4 août 2020 à 22:33:10

                          Heu, à part le formulaire de création, je ne vois pas de commentaire affiché, là… Et si tu pensais avoir un commentaire dans $row, certes il y en a peut-être un, mais non seulement il n'y en a qu'un seul et unique, mais en plus il ne concerne pas nécessairement le bon post, parce que ce sera le même pour chacun d'eux à chaque boucle…

                          • Partager sur Facebook
                          • Partager sur Twitter
                            5 août 2020 à 8:58:51

                            Je te remercie du coup car ca ma donner une idée et tout est rentré dans l'ordre.

                            par contre j'ai du mettre une requête SELECT dans un while :/

                            • Partager sur Facebook
                            • Partager sur Twitter
                              5 août 2020 à 10:30:21

                              Quand tu auras le temps, reprends donc la logique exposée dans l'autre sujet  ;)

                              Et si tu as des questions précises sur comment l'adapter à ton cas, n'hésite pas.

                              • Partager sur Facebook
                              • Partager sur Twitter
                                5 août 2020 à 10:35:55

                                Franchement encore, merci

                                Je dois finir avant tout la base de mon site, le formulaire

                                j'ai ouvert un autre sujet par rapport à ca:

                                Je cherche à faire un formulaire permettant d'envoyer ENTRE 1 ET 10 PHOTOS ou une seule vidéo... je doit pas être loin du truc ;)

                                • Partager sur Facebook
                                • Partager sur Twitter

                                Jointure commentaire et article

                                × 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