Sélection d'articles sur base de plusieurs mots-clés -Proposition de requête SQL
Guermonprez Patrick <pidgee <at> hotmail.com>
2005-06-03 09:31:18 GMT
Bonjour,
Après en avoir parlé avec Déesse A., je vous soumet une proposition de changement pour SPIP afin de pouvoir enfin lister les articles sur base de plusieurs mots clés (Mot1 ET mot2 ET...).
La requête SQL générée actuellement pour la boucle par <BOUCLE_articles(ARTICLES)
{id_mot IN (1,3)} {par titre}> est :
Par contre la requête SQL associée n'est pas correcte. Elle donne :
SELECT articles.id_article, FIND_IN_SET(mots_articles.id_mot, "1,3") AS rang,
articles.descriptif, articles.titre, articles.date, articles.lang
FROM spip_mots_articles AS mots_articles,
spip_articles AS articles
WHERE articles.id_article=mots_articles.id_article
AND mots_articles.id_mot IN (1,3)
AND articles.statut='publie'
GROUP BY articles.id_article
ORDER BY articles.titre
Elle correspond en fait à la liste des articles définis avec le mot clé 1 OU le mot clé 2. Pour trouver les articles définis avec le mot clé 1 ET le mot clé 2, il suffirait de définir la requêtre SQL suivante :
SELECT articles.id_article, FIND_IN_SET(mots_articles.id_mot, "1,3") AS
rang, articles.descriptif, articles.titre, articles.date, articles.lang
FROM spip_mots_articles AS mots_articles,
spip_articles AS articles
WHERE articles.id_article=mots_articles.id_article
AND mots_articles.id_mot IN (1,3)
AND articles.statut='publie'
GROUP BY articles.id_article
HAVING count(*) = 2
ORDER BY articles.titre
La seule différence est que le champ $boucle->group devrait contenir en plus " HAVING count(*) = <nbr de mots clés utilisés>".
Est-il envisageable d'intégrer cette modification dans SPIP pour et que cette sélection sur base du ET entre plusieurs (>1) mots clés soit faite si la page appelée est
http://<host>/SPIP/mot.php3?id_mot=1,3 par exemple (en supposant que la virgule soit choisie comme séparateur d'index de mot clés).
Merci.
Longue vie à SPIP et à l'Open Source !
Pidgee
<div><div>
<div class="RTE">Bonjour,</div>
<div class="RTE"> </div>
<div class="RTE">Après en avoir parlé avec Déesse A., je vous soumet une proposition de changement pour SPIP afin de pouvoir enfin lister les articles sur base de plusieurs mots clés (Mot1 ET mot2 ET...).</div>
<div class="RTE"> </div>
<div class="RTE">La requête SQL générée actuellement pour la boucle par <BOUCLE_articles(ARTICLES)<br>{id_mot IN (1,3)} {par titre}> est :</div>
<div class="RTE"> </div>
<div class="RTE">Par contre la requête SQL associée n'est pas correcte. Elle donne : <br>SELECT articles.id_article, FIND_IN_SET(mots_articles.id_mot, "1,3") AS rang,<br>articles.descriptif, articles.titre, articles.date, articles.lang<br>FROM spip_mots_articles AS mots_articles,<br> spip_articles AS articles<br>WHERE articles.id_article=mots_articles.id_article<br> AND mots_articles.id_mot IN (1,3)<br> AND articles.statut='publie'<br>GROUP BY articles.id_article<br>ORDER BY articles.titre</div>
<div class="RTE"> </div>
<div class="RTE">Elle correspond en fait à la liste des articles définis avec le mot clé 1 OU le mot clé 2. Pour trouver les articles définis avec le mot clé 1 ET le mot clé 2, il suffirait de définir la requêtre SQL suivante :</div>
<div class="RTE"> </div>
<div class="RTE">SELECT articles.id_article, FIND_IN_SET(mots_articles.id_mot, "1,3") AS<br>rang, articles.descriptif, articles.titre, articles.date, articles.lang<br>FROM spip_mots_articles AS mots_articles,<br> spip_articles AS articles<br>WHERE articles.id_article=mots_articles.id_article<br> AND mots_articles.id_mot IN (1,3)<br> AND articles.statut='publie'<br>GROUP BY articles.id_article<br>HAVING count(*) = 2<br>ORDER BY articles.titre</div>
<div class="RTE"> </div>
<div class="RTE">La seule différence est que le champ $boucle->group devrait contenir en plus " HAVING count(*) = <nbr de mots clés utilisés>".</div>
<div class="RTE"> </div>
<div class="RTE">Est-il envisageable d'intégrer cette modification dans SPIP pour et que cette sélection sur base du ET entre plusieurs (>1) mots clés soit faite si la page appelée est <a href="http://<host>/SPIP/mot.php3?id_mot=1,3">http://<host>/SPIP/mot.php3?id_mot=1,3</a> par exemple (en supposant que la virgule soit choisie comme séparateur d'index de mot clés).</div>
<div class="RTE"> </div>
<div class="RTE">Merci.</div>
<div class="RTE"> </div>
<div class="RTE">Longue vie à SPIP et à l'Open Source !</div>
<div class="RTE"> </div>
<div class="RTE">Pidgee</div>
</div></div>