Partage
  • Partager sur Facebook
  • Partager sur Twitter

Requête possible?

Sujet résolu
    16 septembre 2010 à 18:30:42

    Bonjour à tous,

    J'ai fait un système de news avec commentaire. Jusque là tout va bien. Le code fonctionne, et c'est super.

    Mes deux tables :
    CREATE TABLE `news_articles` (
      `news_articles_id` int(11) NOT NULL auto_increment,
      `news_articles_titre` varchar(256) NOT NULL,
      `news_articles_contenu` text NOT NULL,
      `news_articles_auteur` varchar(30) NOT NULL default 'leo48',
      `news_articles_date` datetime NOT NULL,
      PRIMARY KEY  (`news_articles_id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;
    

    CREATE TABLE `news_commentaires` (
      `news_commentaires_id` int(11) NOT NULL auto_increment,
      `news_articles_id` int(11) NOT NULL,
      `news_commentaires_message` text NOT NULL,
      `news_commentaires_auteur` varchar(30) NOT NULL,
      `news_commentaires_date` datetime NOT NULL,
      PRIMARY KEY  (`news_commentaires_id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;
    

    Mais je voudrais améliorer mes scripts, particulièrement pour l'affichage du nombre de commentaire posté pour une news sur la page d'accueil.

    Dans un premier temps j'ai trouvé deux choix:

    Le premier consistant dans ma boucles listant les news de faire une autre requête comptant le nombre de commentaire pour chaque news.
    Ce qui donnait :
    <?php
    //Connexion BDD ....
    
    $req = $bdd->query('SELECT news_articles_id AS news_id,
                            news_articles_titre AS news_titre, 
                            news_articles_contenu AS news_contenu,
                            news_articles_auteur AS news_auteur,
                            DATE_FORMAT(news_articles_date, \'%d/%m/%Y à %Hh%imin%ss\') AS news_date,
                            FROM news_articles ORDER BY news_articles_date DESC LIMIT 0,5') or exit(print_r($bdd->errorInfo()));
    while($data1 = $req->fetch()) {
    
    $req1 = $bdd->prepare('SELECT COUNT(*) AS nb_coms FROM news_commentaires WHERE news_id = :news_id');
    $req1->bindValue(':news_id', $data1['news_id'], PDO::PARAM_INT);
    $req1->execute()
    $data2 = $req1->fetch();
    
    // Suite du code.
    

    Mais cette solution augmente le nombre de requête de manière importante.

    J'ai donc choisis de créer un champs supplémentaire dans ma table 'news_article' contenant le nombre de commentaire. Nombre que je modifie à chaque nouveau commentaire.
    Ça marche. Mais je trouve ce système un peu bidouillé.

    Mon problème



    Je voudrais savoir si par une jointure c'était possible de récupérer le nombre de commentaires ( Mes deux tables sont liées par l'id de la news) du style :
    SELECT n.news_articles_id news_id, 
           n.news_articles_titre news_titre,
           n.news_articles_contenu news_contenu,
           n.news_articles_auteur news_auteur, 
           DATE_FORMAT(n.news_articles_date, '%d/%m/%Y à %Hh%imin%ss') news_date,  
          (COUNT(com.news_commentaires_id) nb_coms WHERE com.id_news = :id_news)
    FROM news_articles n
    RIGHT JOIN commentaires com
    ON n.news_articles_id = com.news_articles_id
    ORDER BY n.news_articles_date DESC LIMIT 0,5
    


    Je n'ai pas testé le code. Je souhaite savoir si c'est possible.

    En vous remerciant d'avance.

    Leo48
    • Partager sur Facebook
    • Partager sur Twitter
      16 septembre 2010 à 18:54:31

      Évidemment que c'est possible et encore heureux, sinon ça serait le bordel.

      Par contre, j'aimerais bien savoir pourquoi tu utilises un RIGHT JOIN plutôt que LEFT JOIN si tu places tes tables dans cet ordre. La bonne requête ressemblerait à ceci :
      SELECT N.news_articles_id,
             N.news_articles_titre,
             N.news_articles_contenu,
             N.news_articles_auteur,
             DATE_FORMAT(n.news_articles_date, '%d/%m/%Y à %Hh%imin%ss') 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 5;
      


      Ça devrait ressembler à ceci, il y a peut-être quelques ajustements à faire.
      • Partager sur Facebook
      • Partager sur Twitter
        16 septembre 2010 à 19:20:20

        Oui en effet avec le LEFT JOIN c'est mieux (les news étant le plus important).

        Est ce que tu pourrais me dire pourquoi on a pas besoin du WHERE pour le COUNT. Après réflexion j'imagine que c'est parce que les table sont reliées à l'aide du champs `news_article_id` et donc ne seront comptés que les commentaires liés l'id de la news.

        Ais-je bien compris?

        En fait c'était ça mon principal problème.
        • Partager sur Facebook
        • Partager sur Twitter
          16 septembre 2010 à 19:21:58

          Oui, mais on en a pas besoin surtout parce que ça marcherait pas autrement. On ne peut pas mettre de WHERE après une fonction, ça te donnerait une erreur de syntaxe.
          • Partager sur Facebook
          • Partager sur Twitter
            16 septembre 2010 à 19:28:14

            Ok merci beaucoup alors.

            PS : je suis toujours étonné par ta grande connaissance du SQL.
            Mais bon je vais pas m'en plaindre ;)
            • Partager sur Facebook
            • Partager sur Twitter

            Requête possible?

            × 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