Partage
  • Partager sur Facebook
  • Partager sur Twitter

Jounture avec Count

ne compte pas correctement

Sujet résolu
    19 mars 2011 à 18:20:42

    Bonjour,
    j'ai un petit soucis avec la fonction COUNT lors de ma requête. :euh:
    J'ai 2 tables, l'une s'appelant news et l'autre commentaires.
    Dans ma table commentaires, il y a un champ id_news qui permet de savoir pour quelle news le commentaire a été posté. Cela me permet également de faire une requête à jointure.
    La voici :
    <?php
    $req = mysql_query('SELECT news.id AS id,
    	   news.auteur AS auteur,
    	   news.titre AS titre,
    	   news.news AS news,
    	   news.categorie AS categorie,
    	   news.date AS date,
    	   news.date_modif AS date_modif,
    	   COUNT(commentaires.*) AS total_com 
    FROM commentaires INNER JOIN news ON news.id=commentaires.id_news ORDER BY news.id');
    while($d = mysql_fetch_assoc($req))
    {
    // etc
    }
    ?>
    

    Je ne sais pas pourquoi mais cette requête me revoie une erreur.
    Ensuite, si je mets COUNT(commentaires.id_news), la requête fonctionne mais ne récupère que la première news en affichant le total de TOUS les commentaires ( 258 ) pour une seule news ! :o
    Ce n'est pas vraiment ce que je cherche ^^
    Ce que je souhaiterais, c'est lister toutes les news et dire pour chacune le nombre de commentaires postés.
    Si vous pouviez m'aider, merci ;)
    • Partager sur Facebook
    • Partager sur Twitter
      19 mars 2011 à 18:41:40

      Hum, ça sert à rien de faire une jointure avec un count... T'as juste à mettre un WHERE news_id = XX... ^^'
      • Partager sur Facebook
      • Partager sur Twitter
        19 mars 2011 à 18:45:03

        Inspire-toi de cette requête

        SELECT nID, titre, news, COUNT(*) AS nb_coms, DATE_FORMAT(publication, "%d %M %Y") AS publication
        FROM news
        LEFT JOIN commentaires USING (nID)
        GROUP BY id_news
        
        • Partager sur Facebook
        • Partager sur Twitter
          19 mars 2011 à 19:11:39

          @Galithielol : En assignant la clause WHERE ( WHERE news.id=commentaires.id_news ) à ma requête, je ne récupère qu'une news. :-°

          @Zazou: J'ai également essayé ta requête en l'adaptant à mon problème. Je récupère toutes les news mais avec le nombre de commentaires totalement faussé ( partout, le nombre de commentaires vaut 1 ) ! :(

          Je continue de chercher...
          • Partager sur Facebook
          • Partager sur Twitter
            19 mars 2011 à 19:53:45

            SELECT N.news_articles_id AS news_id,
            
            				N.news_articles_titre AS news_titre,
            
            				N.news_articles_contenu AS news_contenu,
            
            				N.news_articles_auteur AS news_auteur,
            
            				DATE_FORMAT(n.news_articles_date, \'%d/%m/%Y à %Hh%imin\') AS news_date,
            
            				COUNT(C.*) AS nb_coms
            
            				FROM news_articles N
            
            				LEFT OUTER JOIN commentaires C
            
            				ON N.news_articles_id = C.news_articles_id
            
            				GROUP BY N.news_articles_id,
            
            				N.news_articles_titre,
            
            				N.news_articles_contenu,
            
            				N.news_articles_auteur,
            
            				news_date
            
            				ORDER BY N.news_article_date DESC
            
            				LIMIT 1
            


            Voici le code que j'utilise et qui marche très bien.
            Il me semble assez proche de ta requête donc il faut que tu t'en inspire, mais ça devrait marcher.
            • Partager sur Facebook
            • Partager sur Twitter
              19 mars 2011 à 20:24:01

              Merci pour ton aide leo48 mais ça ne marche toujours pas :
              voici ce que j'ai essayé :
              <?php
              $req = mysql_query('SELECT news.id AS id,
              	   news.auteur AS auteur,
              	   news.titre AS titre,
              	   news.news AS news,
              	   news.categorie AS categorie,
              	   news.date AS date,
              	   news.date_modif AS date_modif,
              	   COUNT(c.id) AS total_com FROM news LEFT OUTER JOIN commentaires c 
              ON c.id_news=news.id  GROUP BY news.id ORDER BY news.id DESC')
              ?>
              

              Ça liste bien les news mais le COUNT compte le nombre de news sur la page ( il y en a 27 ).
              Et par conséquent, il est marqué qu'il y a 27 commentaires sur chaque news ! :)
              • Partager sur Facebook
              • Partager sur Twitter
                19 mars 2011 à 20:40:44

                Reprends ma requête, mais à la place de COUNT(*) tu mets COUNT(cID) (cID=id d'un commentaire)
                GROUP BY id_news c'est pour grouper sur le id des news de la table commentaires
                • Partager sur Facebook
                • Partager sur Twitter
                  19 mars 2011 à 20:52:21

                  Voici ce que j'ai essayé, Zazou :
                  <?php
                  $req = mysql_query('SELECT news.id AS id,
                  	   news.auteur AS auteur,
                  	   news.titre AS titre,
                  	   news.news AS news,
                  	   news.categorie AS categorie,
                  	   news.date AS date,
                  	   news.date_modif AS date_modif,
                  	   COUNT(commentaires.id) AS total_com FROM news LEFT JOIN commentaires USING (id) GROUP BY news.id ORDER BY news.id DESC');
                  ?>
                  

                  Cela me donne le même résultat qu'avec la solution donnée par leo48. Ça liste les news et affiche 27 commentaires pour toutes les news alors qu'en fait, il y a 27 news affichées sur la page.

                  PS : Je reçois des erreurs de syntaxe si j'essaye ORDER BY id_news.
                  De même pour USING (news.id).
                  • Partager sur Facebook
                  • Partager sur Twitter
                    19 mars 2011 à 21:02:45

                    SELECT news.id AS id,
                    	   news.auteur AS auteur,
                    	   news.titre AS titre,
                    	   news.news AS news,
                    	   news.categorie AS categorie,
                    	   news.date AS date,
                    	   news.date_modif AS date_modif,
                    	   COUNT(c.id) AS total_com 
                               FROM news LEFT OUTER JOIN commentaires c 
                               ON c.id_news=news.id  
                               GROUP BY news.id 
                               ORDER BY news.id DESC
                    


                    L'erreur est ici à mon avis :

                    SELECT news.id AS id,
                    	   news.auteur AS auteur,
                    	   news.titre AS titre,
                    	   news.news AS news,
                    	   news.categorie AS categorie,
                    	   news.date AS date,
                    	   news.date_modif AS date_modif,
                    	   COUNT(c.id) AS total_com 
                               FROM news LEFT OUTER JOIN commentaires c 
                               ON news.id = c.id_news
                               GROUP BY news.id 
                               ORDER BY news.id DESC
                    
                    • Partager sur Facebook
                    • Partager sur Twitter
                      19 mars 2011 à 21:08:57

                      Merci encore une fois leo48 mais ça ne va toujours pas.
                      J'avais déjà essayé cette alternative et tout le reste avec INNER JOIN, LEFT JOIN, RIGHT JOIN, NATURAL JOIN, etc...
                      et en inversant également les liaisons mais rien n'y fait, je n'ai toujours pas le compte exact !
                      Je peux également séparer la requête en 2.
                      L'une pour l'affichage et l'autre, je la mets dans ma boucle while en récupérant l'id de la news et en faisant un simple COUNT. Cependant, une requête dans une boucle, ça demande un peu plus de ressource qu'une requête externe.
                      C'est pourquoi, j'aurais préféré régler ce problème par la bonne méthode :)
                      • Partager sur Facebook
                      • Partager sur Twitter
                        19 mars 2011 à 21:14:18

                        SELECT news.id id,
                        	   news.auteur auteur,
                        	   news.titre titre,
                        	   news.news news,
                        	   news.categorie categorie,
                        	   news.date date,
                        	   news.date_modif date_modif,
                        	   COUNT(commentaires.id) total_com 
                                  FROM news 
                                  LEFT JOIN commentaires ON commentaires.id_news = news.id 
                                  GROUP BY news.id, news_titre, news.news, news.categorie, news.date, news.date_modif
                                  ORDER BY news.id DESC
                        


                        Il n'y a pas de raison pour que cela ne marche pas. S'il y a un problème il vient d'ailleurs que de la requête.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          19 mars 2011 à 21:19:36

                          Merci pour ta réponse pierreet, tout fonctionne.
                          Je ne sais pour quelle raison ta requête fonctionne alors qu'elle est similaire à la solution donnée par leo48. :)
                          • Partager sur Facebook
                          • Partager sur Twitter

                          Jounture avec Count

                          × 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