J’interroge une table dans une base de données externe (mais sur le même serveur que la base SPIP) avec une boucle classique ({where xxx}).
La table contient des données présentées ainsi (c’est symbolique). Un peu plus de 200 000 lignes (OpenData que j’importe automatiquement 4 fois par jour, donc je ne peux rien modifier) :
Nom_etablissement | Evaluation
Etablissement1 | BIEN
Etablissement1 | MOYEN
Etablissement3 | TRESBIEN
Etablissement2 | BIEN
Etablissement1 | SUPER
Etablissement2 | BIEN
Etablissement1 | SUPER
Je liste ces informations en ne faisant apparaître qu’une fois chaque établissement avec un {fusion Nom_etablissement} dans la requête ou un (Nom_etablissement|unique) dans l’affichage.
MAIS, je veux surtout afficher à côté du nom, le nombre d’occurrences, par exemple :
Etablissement1 (4 évaluations)
Etablissement 2 (2 évaluations)
…
Je pourrais faire une requête pour chaque établissement, mais j’en ai plusieurs milliers, donc ça prendrait trop de temps.
J’ai essayé avec #COMPTEUR_BOUCLE mais je n’y suis pas arrivé.
Et sinon tu peux utiliser directement une requete SQL SELECT nom_etablissement, count(*) AS combien, ... GROUP BY nom_etablissement,
utilisée via <BOUCLE_d1(DATA){source sql, #GET{requete}}>...
comme dans la question boucle data sql génère une 404 - #5 par tierce
Merci BEAUCOUP ! Cela fonctionne… mais j’ai un autre problème :
Dans ma requête, si je mets le département en dur, ça marche nickel. Si je mets la variable #GET{DEPARTEMENT_CODE}, sa valeur apparaît bien dans le contenu de ma page (si je la fais afficher) mais pas dans la variable finale qui correspond à la requête. J’ai zappé un truc ?
La variable :
#SET{requete, "SELECT `Libelle_commune`,`Code_postal`, count(`Libelle_commune`) AS combien FROM liste_inspections where `code_postal` LIKE '#GET{DEPARTEMENT_CODE}%' GROUP BY `Libelle_commune`"}
Le résultat :
SELECT `Libelle_commune`,`Code_postal`, count(`Libelle_commune`) AS combien FROM liste_inspections where `code_postal` LIKE '#GET{DEPARTEMENT_CODE}%' GROUP BY `Libelle_commune`
Comme la valeur est entre double quotes, spip la préserve et ne cherche pas à interpréter le contenu.
Il te faut donc séparer et concaténer les différents morceaux devant ou pas être interprétés, avec [(#VAL{"le début"}|concat{#GET{...}, "une autre partie", ... "la fin" })]
En suivant ta piste, j’ai utilisé une autre solution qui me semble un peu plus facile à comprendre quand je retournerais dans le code dans quelques mois :
#SET{requete, "SELECT `Libelle_commune`,`Code_postal`, count(`Libelle_commune`) AS combien FROM liste_inspections where `code_postal` LIKE '"}
#SET{requete, (#GET{requete}|concat{#GET{DEPARTEMENT_CODE}})}
#SET{requete, (#GET{requete}|concat{"%' GROUP BY `Libelle_commune`"})}
Si tu veux.
A priori cette même requête s’écrit aussi de la manière suivante,
somme toute assez lisible :
#SET{requete, #VAL|concat{
"SELECT `Libelle_commune`,`Code_postal`, count(`Libelle_commune`) AS combien ",
" FROM liste_inspections ",
" WHERE `code_postal` LIKE '", #GET{DEPARTEMENT_CODE}, "%' ",
" GROUP BY `Libelle_commune`"}
}