Partage
  • Partager sur Facebook
  • Partager sur Twitter

Quelques difficultés de jointures...

(CodeIgniter)

Sujet résolu
    3 juin 2011 à 23:30:09

    Bonsoir chers Zéros,
    Je suis sur un script de news et j'ai beaucoup de mal à récupérer tout ce qu'il faut :)
    Soit trois tables :
    PIA1_commentaires
    PIA1_news
    PIA1_register
    Dont voici leurs structures (J'y ai enlevé ce qui ne sert pas dans mon problème)
    CREATE TABLE `PIA1_commentaires` (
       `id` tinyint(4) not null auto_increment,
       `id_news` tinyint(4),
       PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=6;
    
    CREATE TABLE `PIA1_news` (
       `id` tinyint(4) not null auto_increment,
       `titre` varchar(210),
       `text` text,
       `id_user` tinyint(4),
       `date` timestamp not null default CURRENT_TIMESTAMP,
       PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=6;
    
    CREATE TABLE `PIA1_register` (
       `id` int(20) unsigned not null auto_increment,
       `prenom` varchar(254) not null,
       PRIMARY KEY (`id`),
       KEY `id` (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=49;
    


    Voici le code de mon modèle qui récupère les requêtes
    <?php
    	public function liste_news($nb, $debut)
    	{
    		return $this->db->select('news.id, 
                                      register.id as register_id, 
                                      commentaires.id as comment_id,
                                      news.titre, 
                                      news.text, 
                                      news.id_user, 
                                      news.date, 
                                      count(*) as nb_commentaires, 
                                      commentaires.id_news')
                            ->join('commentaires', 'commentaires.id_news = news.id', 'left')
                            ->join('register', 'register.id = news.id_user', 'left')
                            ->order_by('date', 'desc')
                            ->group_by('commentaires.id_news')
                            ->get($this->table, (int) $nb, (int) $debut)
                            ->result_array();
    	}
    

    Pour ceux qui veulent pas trop s’embêter, voici la requête générée :
    SELECT `PIA1_news`.`id`, `PIA1_register`.`id` as register_id, `PIA1_commentaires`.`id` as comment_id, `PIA1_news`.`titre`, `PIA1_news`.`text`, `PIA1_news`.`id_user`, `PIA1_news`.`date`, count(*) as nb_commentaires, `PIA1_commentaires`.`id_news`
    FROM (`PIA1_news`)
    LEFT JOIN `PIA1_commentaires` ON `PIA1_commentaires`.`id_news` = `PIA1_news`.`id`
    LEFT JOIN `PIA1_register` ON `PIA1_register`.`id` = `PIA1_news`.`id_user`
    GROUP BY `PIA1_commentaires`.`id_news`
    ORDER BY `date` desc
    LIMIT 10
    

    Le problème est que (cf le résultat plus bas) :
    - toutes les news ne s'affichent pas.
    - Le nombre de commentaires ne correspondent pas.
    Résultat de requete
    résultats de la requête


    Alors que ma table de news en contient 5
    Table de news
    Table de news


    Et les commentaires sont seulement sur la première news.
    Commentaires
    Table de commentaires


    Pourtant, Cette requête que j'avais fait au préalable semblait fonctionner. Je me suis basé dessus mais j'ai du passer à coté d'un élément...
    Image utilisateur
    Ancienne requête


    Voilà je pense que j'ai fais le tour de la question...
    En gros : "ça marche pas !"

    Merci pour votre aide et bonne nuit aux autres zéros :)
    • Partager sur Facebook
    • Partager sur Twitter
      5 juin 2011 à 22:37:00

      Petit up,
      remplacer count(*) par count(`PIA1_commentaires`.`id`) permet d'avoir une bonne correspondance nombre de commentaires par news.
      Cependant, toutes mes news ne s'affichent toujours pas.
      • Partager sur Facebook
      • Partager sur Twitter
        18 juin 2011 à 13:36:08

        Et oui, c'est ça !
        (group by news.id)
        Merci beaucoup ;)
        • Partager sur Facebook
        • Partager sur Twitter

        Quelques difficultés de jointures...

        × 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