Compter les occurrences en double dans une table externe

Bonjour,

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é.

Avez-vous une piste ?

Merci d’avance.

Julien

https://contrib.spip.net/Le-critere-compteur-de-Bonux
Balise #COMPTEUR de spip bonux

Pas sur que #COMPTEUR soit la bonne car elle porte sur une jointure,
mais peut être #COMPTE https://contrib.spip.net/Bonux-pour-SPIP3

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

1 « J'aime »

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`

Merci d’avance !

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" })]

Merci beaucoup une fois de plus ! :grin:

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`"}
}

Merci, tu es un champion ! :grin:

Julien