Le critère fusion
permet de regrouper les résultats d’une boucle SPIP selon les valeurs distinctes d’un champ.
Si la boucle sans le critère {fusion champ_sql}
ramène plusieurs enregistrements ayant la même valeur de champ_sql
, alors, la boucle avec le critère {fusion champ_sql}
ne présentera qu’un seul de ceux ci.
Pour cela, la requête SQL générée intègre une instruction GROUP BY
.
Exemple ’pédagogique’
La boucle suivante affichera les titres de tous les articles du site :
<BOUCLE_tous(ARTICLES)>
#TITRE
</BOUCLE_tous>
La boucle suivante, avec un critère fusion
portant sur la rubrique, partira également de tous les articles, mais les regroupera par id_rubrique identique, et ne présentera au final qu’un seul article par rubrique.
<BOUCLE_extrait(ARTICLES){fusion id_rubrique}>
#TITRE
</BOUCLE_extrait>
Exemples ’appliqués’
La boucle suivante affiche les 10 messages de forum les plus récents, triés par date, et émanant d’une IP distincte :
<BOUCLE_comment(FORUMS){plat}{par date}{inverse}{0,10}{fusion ip}>
<INCLURE{fond=inc/intro_commentaire}{id_forum}>
</BOUCLE_comment>
Il est également possible d’utiliser des expressions SQL en paramètre du critère. La boucle suivante affichera la liste des années pour lesquelles il y a au moins un article :
<BOUCLE_annees_avec_articles(ARTICLES){par date}{inverse}{fusion YEAR(date)}>
[(#DATE|annee)]
</BOUCLE_annees_avec_articles>
Et voici comment faire une pagination par initiale du titre des articles :
<B_alpha><nav class="pagination"><ul>
<BOUCLE_alpha(ARTICLES) {par titre} {fusion LEFT(titre,1)}>
<li><a href='[(#SELF|parametre_url{lettre, [(#TITRE|substr{0,1})]})]'>[(#TITRE|substr{0,1})]</a></li>
</BOUCLE_alpha></ul></nav>
</B_alpha>
Une contribution présente comment utiliser ce critère pour lister les articles par année, puis par mois. Voir
Plusieurs colonnes
Il est possible de grouper les résultats sur plusieurs colonnes, en utilisant plusieurs fois le critère, par exemple {fusion xx}{fusion yy}
, qui génèrera dans la requête SQL GROUP BY xx,yy
Attention
Un critère de tri {par xxx}
combiné au critère {fusion champ_sql}
ne retournera pas forcément les résultats attendus.
- <BOUCLE_a1(ARTICLES){tout}{par id_article}>
ramène les articles triés par id_article (du 1 au 10000 par exemple).
- <BOUCLE_a2(ARTICLES){par id_article}{fusion id_rubrique}>
ramène les articles, triés par id_article après regroupement par id_rubrique, mais ces regroupements sont faits en vrac et, a priori, sans tris particuliers !
Voir également
- le critère {doublons}
- le filtre |unique