[SPIP Zone] [Bonux] Problème avec le critère compteur

Soit une boucle toute simple pour trier les articles par nombre de message de forum :

<BOUCLE_essai(ARTICLES){compteur forum}{par compteur_forum}{inverse}>
#COMPTEUR{forum} - #TITRE <br />
</BOUCLE_essai>

Au lieu de trier les articles par leur nombre de messages de forum, ils sont triés par le nombre de messages de forum écrits par les auteurs de l'article.

En l'occurence, la requête SQL générée est :

SELECT COUNT(L2.id_forum) AS compteur_forum, articles.titre, articles.lang
FROM spip_articles AS `articles`
INNER JOIN spip_auteurs_articles AS L1 ON ( L1.id_article = articles.id_article )
INNER JOIN spip_forum AS L2 ON ( L2.id_auteur = L1.id_auteur )
WHERE (articles.statut = 'publie')
  AND (articles.date < '2037-09-05 09:52:00')
GROUP BY articles.id_article
ORDER BY compteur_forum DESC

Il a apparaît que la table spip_forum est jointe selon id_auteur et non selon id_article !!

NB : SPIP 2.1 et dernière version SVN de bonux

Cordialement

Le 20 avril 2010 11:55, Joseph <joseph@larmarange.net> a écrit :

Soit une boucle toute simple pour trier les articles par nombre de message
de forum :

<BOUCLE_essai(ARTICLES){compteur forum}{par compteur_forum}{inverse}>
#COMPTEUR{forum} - #TITRE <br />
</BOUCLE_essai>

Au lieu de trier les articles par leur nombre de messages de forum, ils sont
triés par le nombre de messages de forum écrits par les auteurs de
l'article.

En l'occurence, la requête SQL générée est :

SELECT COUNT(L2.id_forum) AS compteur_forum, articles.titre, articles.lang
FROM spip_articles AS `articles`
INNER JOIN spip_auteurs_articles AS L1 ON ( L1.id_article =
articles.id_article )
INNER JOIN spip_forum AS L2 ON ( L2.id_auteur = L1.id_auteur )
WHERE (articles.statut = 'publie')
AND (articles.date < '2037-09-05 09:52:00')
GROUP BY articles.id_article
ORDER BY compteur_forum DESC

Il a apparaît que la table spip_forum est jointe selon id_auteur et non
selon id_article !!

Oui et ça n'est pas moins juste qu'une jointure sur la table forum par
id_article
Ce problème n'est pas nouveau, il est lié au mécanisme des jointures
auto réalisées par le compilateur, et au fait qu'entre 2 jointures
possibles, la première trouvée sera utilisée.

Tu peux lever l'ambiguité en écrivant
<BOUCLE_essai(ARTICLES forum){compteur forum}{par compteur_forum}{inverse}>

Cédric

Le 20/04/2010 11:23, Cédric Morin a écrit :

Ce problème n'est pas nouveau, il est lié au mécanisme des jointures
auto réalisées par le compilateur, et au fait qu'entre 2 jointures
possibles, la première trouvée sera utilisée.

Tu peux lever l'ambiguité en écrivant
<BOUCLE_essai(ARTICLES forum){compteur forum}{par compteur_forum}{inverse}>

Cédric

Merci pour l'astuce.
Essai avec ta proposition. J'obtiens toujours :

SELECT COUNT(L2.id_forum) AS compteur_forum, articles.titre, articles.lang
FROM spip_articles AS `articles`
INNER JOIN spip_auteurs_articles AS L1 ON ( L1.id_article = articles.id_article )
INNER JOIN spip_forum AS L2 ON ( L2.id_auteur = L1.id_auteur )
WHERE (articles.statut = 'publie')
  AND (articles.date < '2037-09-05 11:47:14')
GROUP BY articles.id_article
ORDER BY compteur_forum DESC

Si j'essaie
<BOUCLE_essai(ARTICLES){forum.statut=publie}{compteur forum}{par compteur_forum}{inverse}>

J'obtiens
SELECT COUNT(L4.id_forum) AS compteur_forum, articles.titre, articles.lang
FROM spip_articles AS `articles`
INNER JOIN spip_auteurs_articles AS L3 ON ( L3.id_article = articles.id_article )
INNER JOIN spip_forum AS L4 ON ( L4.id_auteur = L3.id_auteur )
INNER JOIN spip_auteurs_articles AS L1 ON ( L1.id_article = articles.id_article )
INNER JOIN spip_forum AS L2 ON ( L2.id_auteur = L1.id_auteur )
WHERE (articles.statut = 'publie')
  AND (articles.date < '2037-09-05 11:50:26')
  AND (L2.statut = 'publie')
GROUP BY articles.id_article
ORDER BY compteur_forum DESC

Au final, le plus simple pour classer les articles par nombre de commentaires reste de reprendre le critère compteur_publie initial provenant de Classer les articles par nombre de commentaires - SPIP-Contrib

Encore merci pour les explications

Joseph

Le 20 avril 2010 14:01, Joseph <joseph@larmarange.net> a écrit :

Le 20/04/2010 11:23, Cédric Morin a écrit :

Ce problème n'est pas nouveau, il est lié au mécanisme des jointures
auto réalisées par le compilateur, et au fait qu'entre 2 jointures
possibles, la première trouvée sera utilisée.

Tu peux lever l'ambiguité en écrivant
<BOUCLE_essai(ARTICLES forum){compteur forum}{par
compteur_forum}{inverse}>

Cédric

Merci pour l'astuce.
Essai avec ta proposition. J'obtiens toujours :

SELECT COUNT(L2.id_forum) AS compteur_forum, articles.titre, articles.lang
FROM spip_articles AS `articles`
INNER JOIN spip_auteurs_articles AS L1 ON ( L1.id_article =
articles.id_article )
INNER JOIN spip_forum AS L2 ON ( L2.id_auteur = L1.id_auteur )
WHERE (articles.statut = 'publie')
AND (articles.date < '2037-09-05 11:47:14')
GROUP BY articles.id_article
ORDER BY compteur_forum DESC

Ah oui mince, ça ne résoud rien car la jointure se fait de la même façon.
Tu peux ouvrir un ticket sur trac pour garder la trace stp ?

Cédric

Le 20/04/2010 13:01, Cédric Morin a écrit :

Ah oui mince, ça ne résoud rien car la jointure se fait de la même façon.
Tu peux ouvrir un ticket sur trac pour garder la trace stp ?

Cédric

http://trac.rezo.net/trac/spip/ticket/1933

Est-ce bien sur le trac de SPIP qu'il fallait ouvrir un ticket ou bien cela aura du être sur le trac de la zone ?

Cordialement