Critère {select ...} #4703

Open
opened 2 years ago by JLuc · 6 comments
JLuc commented 2 years ago

De même que le critère {where ...} permet de faire ce que les critères classiques SPIP ne permettent pas de faire, il semble qu'un critère {select ...} serait utile parfois.

Par exemple dans https://forum.spip.net/fr_274347.html, les titres sont de la forme "Menu cantine de la semaine 12" et il fallait trier par n° de semaine. Ç'aurait été possible avec

BOUCLE_1(ARTICLES){select "SUBTSTRING(titre,27,30) as fin_titre"}{par fin_titre}

(dans le cas du forum, un autre champ a finalement permis le tri)

De même que le critère {where ...} permet de faire ce que les critères classiques SPIP ne permettent pas de faire, il semble qu'un critère {select ...} serait utile parfois. Par exemple dans https://forum.spip.net/fr_274347.html, les titres sont de la forme "Menu cantine de la semaine 12" et il fallait trier par n° de semaine. Ç'aurait été possible avec <pre>BOUCLE_1(ARTICLES){select "SUBTSTRING(titre,27,30) as fin_titre"}{par fin_titre}</pre> (dans le cas du forum, un autre champ a finalement permis le tri)
b_b commented 2 years ago
Owner

Heu, j'ai souvenir d'avoir publié une astuce à propos d'un truc similaire, cf https://www.weblog.eliaz.fr/article80.html où on utilise simplement un {par SUBSTRING_INDEX(titre,".",-1)}. Ça répond au besoin ou je suis à côté de la plaque ?

Heu, j'ai souvenir d'avoir publié une astuce à propos d'un truc similaire, cf https://www.weblog.eliaz.fr/article80.html où on utilise simplement un `{par SUBSTRING_INDEX(titre,".",-1)}`. Ça répond au besoin ou je suis à côté de la plaque ?
Owner

Oui mais JLuc ne dit pas tout, ce qu'il veut c'est pouvoir utiliser ensuite ce champ calculé comme un champ de tri dynamique, ce que tu ne peux pas faire avec une expression SQL.

Mais justement, c'est là que le bât blesse : il ne faut pas seulement faire un select, il faut que le compilateur comprenne que ça génère un champ fin_titre pour l'exemple de JLuc, ce qui semble assez peu propice à la syntaxe proposée qui nécessiterait de parser l'expression SQL, et il faut ensuite que ce champ soit utilisable comme un champ normal, via une balise ou dans un autre critère.

C'est donc très loin d'être simple et pour cette raison ça va surement attendre longtemps :)

Oui mais JLuc ne dit pas tout, ce qu'il veut c'est pouvoir utiliser ensuite ce champ calculé comme un champ de tri dynamique, ce que tu ne peux pas faire avec une expression SQL. Mais justement, c'est là que le bât blesse : il ne faut pas seulement faire un select, il faut que le compilateur comprenne que ça génère un champ `fin_titre` pour l'exemple de JLuc, ce qui semble assez peu propice à la syntaxe proposée qui nécessiterait de parser l'expression SQL, et il faut ensuite que ce champ soit utilisable comme un champ normal, via une balise ou dans un autre critère. C'est donc très loin d'être simple et pour cette raison ça va surement attendre longtemps :)
b_b commented 2 years ago
Owner

Oui mais JLuc ne dit pas tout, ce qu'il veut c'est pouvoir utiliser ensuite ce champ calculé

Héhé, je le pensais bien car ma proposition fait très bien le job pour la demande de tri, mais aucunement pour récupérer la valeur en question dans une balise, cf "il fallait trier par n° de semaine".

> Oui mais JLuc ne dit pas tout, ce qu'il veut c'est pouvoir utiliser ensuite ce champ calculé Héhé, je le pensais bien car ma proposition fait très bien le job pour la demande de tri, mais aucunement pour récupérer la valeur en question dans une balise, cf "il fallait *trier* par n° de semaine".
Poster

Ya une solution pour ce besoin : la boucle DATA sql !
BOUCLE_ma_requete(DATA){source sql, "SELECT id_article as id, SUBSTRING(titre,3,10) as letitre FROM spip_articles"}
ça marche ! (Et au passage, ça permettrait également de se passer du critère "where")

Sinon, pour simplifier le parser, j'imaginais n'autoriser sélectionner qu'un seul élément par critère select.
Par exemple pour la boucle citée il faudrait 2 critères select : « select id_article as id »« select SUBSTRING(titre,3,10) as letitre »

Ya une solution pour ce besoin : la boucle DATA sql ! `BOUCLE_ma_requete(DATA){source sql, "SELECT id_article as id, SUBSTRING(titre,3,10) as letitre FROM spip_articles"}` ça marche ! (Et au passage, ça permettrait également de se passer du critère "where") Sinon, pour simplifier le parser, j'imaginais n'autoriser sélectionner qu'un seul élément par critère select. Par exemple pour la boucle citée il faudrait 2 critères select : `« select id_article as id »« select SUBSTRING(titre,3,10) as letitre »`
Poster

Oups trac bouffe des trucs mais impossible de savoir quoi à l'avance.
Donc lire SUBSTRING«titre,3,10» à la place de SUBSTRING dans le post précédent.

Oups trac bouffe des trucs mais impossible de savoir quoi à l'avance. Donc lire SUBSTRING«titre,3,10» à la place de SUBSTRING dans le post précédent.
b_b commented 2 years ago
Owner

jluc - a écrit :

Oups trac bouffe des trucs mais impossible de savoir quoi à l'avance.
Donc lire SUBSTRING«titre,3,10» à la place de SUBSTRING dans le post précédent.

Ici c'est redmine :p Et il propose un raccourci à base de ` pour encadrer les lignes de code, j'ai corrigé ton commentaire ;)

jluc - a écrit : > Oups trac bouffe des trucs mais impossible de savoir quoi à l'avance. > Donc lire SUBSTRING«titre,3,10» à la place de SUBSTRING dans le post précédent. Ici c'est redmine :p Et il propose un raccourci à base de ` pour encadrer les lignes de code, j'ai corrigé ton commentaire ;)
Sign in to join this conversation.
No Milestone
No project
No Assignees
3 Participants
Notifications
Due Date

No due date set.

Dependencies

This issue currently doesn't have any dependencies.

Loading…
There is no content yet.