Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 11-10-2009 17:10:44

supertino7
Membre
Date d'inscription: 21-02-2009
Messages: 113

COUNT() sur une jointure

Bonjour,

j'ai une table articles ainsi qu'une table commentaires.

J'aimerais sélectionner les articles ainsi que le décompte des commentaires.

Code:

$select->from($this, array('content.*', 'nb_coms' => 'COUNT(coms.id)'))
               // Joindre le nom de l'auteur
               ->join('membres', 'membres.id = content.id_redacteur', array('nom' => 'membres.nom','prenom' => 'membres.prenom','id_redacteur' => 'membres.id'))
               // Joindre le nom de la catégorie
               ->join('content_categories', 'content_categories.id = content.id_categorie', array('ss_content_categories.categorie'))
                  // Décompte des commentaires
                   ->joinLeft('coms', 'content.id = coms.id_article', array('coms.id'));
               ->order('date_published DESC')
               ->setIntegritycheck(false);

Le décompte des commentaires est bien effectué, mais le problème c'est qu'il ne me sort plus que les articles qui possèdes au moins 1 commentaires. Donc le NULL est impossible.
Quelle est ma solution ?

Merci d'avance.

Hors ligne

 

#2 11-10-2009 23:53:11

Willmore
Membre
Lieu: Savigny Le Temple
Date d'inscription: 25-05-2009
Messages: 31

Re: COUNT() sur une jointure

qu'on me corrige si je me trompe (week-end chargé, et cerveau en piteux état smile ) mais il me semble que rien que le fait de faire la requête avec la jointure ne fait que ressortir les messages avec au moins 1 commentaire (pour que la contrainte appliquée par JOIN <nom_table_liée> ON champs1 = champs2 soit vérifiée).

J'ai rencontré le même type de problème avec le développement d'un petit script de forum, j'ai finalement opté pour la solution consistant à rajouter un champs 'nb_replies' (pour toi 'nb_commentaires') initialisé à 0 dans la table topic (pour toi 'articles') incrémenté ou décrémenté automatiquement grace a un trigger sur les AFTER INSERT & AFTER DELETE de la table 'messages' (== 'commentaires')

En espérant t'avoir apporté une piste wink

Dernière modification par Willmore (11-10-2009 23:56:12)


Amicalement,

Will

Hors ligne

 

#3 12-10-2009 10:25:54

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: COUNT() sur une jointure

deux chose
@Willmore il faut utiliser LEFT JOIN $s->joinLeft(...)
et pour le count tu ne peux pas le mettre comme membre de la liste des élément du from car $s->from vas préfixer ces éléments par le nom de la table
il te faut pour cela utiliser Zend_Db_Expr

pour finir une remarque
$select->from($this) ou $select->from($this, '*')
vas te donner
SELECT content.* FROM content
tu ne dois pas préfixer le * c'est Zend_Db_Select qui s'en occupe

je n'ai pas ZF sous la main mais de tête je donnerais un  truc du genre

Code:

$select->from($this, '*')
  // Joindre le nom de l'auteur
  ->join('membres', 'membres.id = content.id_redacteur', 
       array('nom' => 'membres.nom','prenom' => 'membres.prenom','id_redacteur' => 'membres.id'))
  // Joindre le nom de la catégorie
  ->join('content_categories', 'content_categories.id = content.id_categorie',
    array('ss_content_categories.categorie'))
  // Décompte des commentaires
      ->joinLeft('coms', 'content.id = coms.id_article',  array('nb_coms' => new Zend_Db_expr('COUNT(coms.id)')));
  ->order('date_published DESC')
  ->setIntegritycheck(false);

A+JYT

Hors ligne

 

#4 12-10-2009 11:07:27

supertino7
Membre
Date d'inscription: 21-02-2009
Messages: 113

Re: COUNT() sur une jointure

Merci pour votre aide.

Bon ça ne prend pas hmm

Pour faire plus simple, je teste les requêtes directement en SQL dans PhpMyAdmin :

Code:

SELECT `content`.*, COUNT(coms.id) AS `nb_coms` FROM `content` LEFT JOIN `coms` ON content.id = coms.id_article

Celle ci me sort un seul article (qui est d'ailleurs le dernier de la liste en terme d'id), et le nb total de commentaires dans la table commentaires.

Il me faudrait au final trouver la bonne requête.
Je continue de chercher hmm

Hors ligne

 

#5 12-10-2009 11:24:53

supertino7
Membre
Date d'inscription: 21-02-2009
Messages: 113

Re: COUNT() sur une jointure

Bon il me semble que j'ai trouvé.

J'ai rajouté une clause GROUP BY sur les articles.

Code:

$select->group('content.id');

Hors ligne

 

#6 12-10-2009 12:54:09

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: COUNT() sur une jointure

oui pour faire un count il faut un regroupement

Hors ligne

 

#7 12-10-2009 14:13:16

supertino7
Membre
Date d'inscription: 21-02-2009
Messages: 113

Re: COUNT() sur une jointure

Ok, on en apprend tous les jours smile

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages