Partage
  • Partager sur Facebook
  • Partager sur Twitter

Select count(*) multiples

Sujet résolu
    21 février 2011 à 20:31:29

    Hello,

    J'ai deux tables :

    1) News, qui contient un id, un titre ainsi qu'un contenu.
    2) Commentaires qui contient un id, l'id de la news, et le commentaire.

    J'affiche sur ma home toutes les news. J'aimerai afficher à côté de chacune d'entre elles le nombre de commentaires. La requête la plus appropriée est donc un SELECT COUNT(*). Seulement je ne sais pas comment rédiger ma requête afin qu'elle compte d'un coup le nombre de commentaires pour chaque news. J'utilise PDO.

    Merci :)
    • Partager sur Facebook
    • Partager sur Twitter
      21 février 2011 à 22:11:03

      Bonjour, Tu dois "compter" le nombre de idNews dans Commentaire PAR idNews

      SELECT n.titre AS titre,n.contenu AS contenu,COUNT(c.idNews)AS nbrCom
      FROM NEWS n, COMMENTAIRES c
      WHERE n.idNews = c.idNews(+) // Jointure externe
      GROUP BY n.titre,n.contenu // Tu groupe par NEWS donc tu mets ici tous ce qui n'est pas dans le COUNT
      
      • Partager sur Facebook
      • Partager sur Twitter
        21 février 2011 à 23:24:25

        Ça ne fonctionnera pas pour les news qui n'ont pas de commentaires, il faut faire une jointure externe. Par ailleurs, baignoire, tu utilises la syntaxe désuète des jointures, aussi bien utiliser la "nouvelle" (enfin, ça fait 20 ans, elle n'est plus si nouvelle).
        • Partager sur Facebook
        • Partager sur Twitter
          22 février 2011 à 0:21:46

          C'est vrai, j'avais oublié les news sans commentaires.
          Pourquoi désuète ? Tous le monde l'utilise encore et ça ne pose pas de problème.
          Chacun sont truc ;)
          • Partager sur Facebook
          • Partager sur Twitter
            22 février 2011 à 1:03:48

            Parce qu'elle est infiniment moins claire et qu'un néophyte sera incapable de lire la requête.
            • Partager sur Facebook
            • Partager sur Twitter
              22 février 2011 à 8:03:53

              Citation : Fayden

              Parce qu'elle est infiniment moins claire et qu'un néophyte sera incapable de lire la requête.



              Salut !

              Suis pas tellement d'accord avec ça, moi... :-°

              Je trouve qu'une requête d'une genre

              SELECT machin
              FROM table1, table2
              WHERE clé_primaire = clé_étrangère
              


              est beaucoup plus lisible que

              SELECT machin
              FROM table1, tabl2
              INNER JOIN table1 ON table2.clé_primaire = table1.clé_étrangère
              


              Si on parle français :p , la 1ère requête est beaucoup plus compréhensible, je trouve.

              "SELECTIONNE machin DEPUIS table1 ET table2 OÙ clé primaire = clé étrangère"

              Enfin, ce n'est qu'un avis perso. ;)
              • Partager sur Facebook
              • Partager sur Twitter
                22 février 2011 à 8:43:49

                Les opérateurs de jointures sont bien plus lisibles.

                * Si tu as une condition dans le where qui ne relève pas de la jointure, impossible de déterminer ce qu'est la condition de jointure.
                * Il est un peu étrange d'utiliser un opérateur à la fois pour restreindre (filtrage) et pour élargir (jointure) un jeu de résultat.
                * Si la condition de jointure venait à être enlevée, ce qui pourrait arriver puisqu'il n'est pas aisé de savoir ce qu'elle est, cela résulterait en un produit cartésien des tables et un gros coup de gueule du sgbdr si les tables ne sont pas des lilliputiennes.
                * Si tu as plusieurs jointures, ce qui n'est pas rare dans un modèle normalisé, utiliser les opérateurs prévu à cet effet permet de clairement séparer les conditions de chaque jointure, ce qui est impossible en mettant tout dans le where.
                * En plaçant des tabulations correctement, on peut voir très clairement l'arbre de jointure avec les opérateurs de jointures.

                Par ailleurs, dans ta "traduction française", ton ET me fait davantage penser à un UNION qu'à un JOIN.
                • Partager sur Facebook
                • Partager sur Twitter
                  22 février 2011 à 9:00:45

                  T'as gagné :p

                  Mais, cela ne va pas m'empêcher d'utiliser la clause WHERE à la place de JOIN :lol:

                  Sûrement parce que je trouve qu'utiliser WHERE pour les requêtes dans un site WEB est plus lisible (pour moi en tout cas :-° )
                  • Partager sur Facebook
                  • Partager sur Twitter
                    22 février 2011 à 15:27:33

                    Enfin c'est un peu hors sujet puisqu'il faut mettre un LEFT JOIN ici...

                    SELECT n.*, COUNT(c.idNews) AS nbrCom
                    FROM NEWS n
                    LEFT JOIN COMMENTAIRES c USING (idNews)
                    GROUP BY n.idNews
                    


                    (avec ici une utilisation utile du group by foireux de mysql)
                    • Partager sur Facebook
                    • Partager sur Twitter
                      27 février 2011 à 13:17:25

                      Merci pour vos réponses.
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Select count(*) multiples

                      × 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