Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
j'ai une table articles ainsi qu'une table commentaires.
J'aimerais sélectionner les articles ainsi que le décompte des commentaires.
$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
qu'on me corrige si je me trompe (week-end chargé, et cerveau en piteux état ) 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
Dernière modification par Willmore (11-10-2009 23:56:12)
Hors ligne
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
$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
Merci pour votre aide.
Bon ça ne prend pas
Pour faire plus simple, je teste les requêtes directement en SQL dans PhpMyAdmin :
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
Hors ligne
Bon il me semble que j'ai trouvé.
J'ai rajouté une clause GROUP BY sur les articles.
$select->group('content.id');
Hors ligne
oui pour faire un count il faut un regroupement
Hors ligne
Ok, on en apprend tous les jours
Hors ligne