Re-bonjour,
Alors, en menant quelques recherches, je suis d'abord tombé sur cette page, qui m'a fait découvrir une possible solution. Quelques tests m'ont permis de vérifier le bon fonctionnement.
Il s'avère qu'il s'agit d'expression de table commune (ou CTE : Common Table Expression), et que cette possibilité existe depuis MySql 8.0 (sorti en 2018) ou depuis MariaDB 10.2 (sorti en 2017).
Vous pouvez consulter la page d'aide dédiée MySQL et la page d'aide dédiée MariaDB.
Du coup, l'application à mon usage est la suivante :
- En début de requête SQL, j'intègre quelques lignes pour définir mes valeurs
- En début de liste des tables, j'ajoute ma table de valeurs
- Dans mes requêtes, j'utilise ma table de valeurs
Exemple concret, en passant de la requête suivante :
SELECT
cc.path,cc.name,c.fullname,FROM_UNIXTIME(c.startdate)
FROM prefix_course AS c
JOIN prefix_course_categories AS cc ON cc.id = c.category
WHERE c.shortname LIKE '%droit%' -- Pour cibler les cours
AND cc.path LIKE "%/1055/1057%" -- Pour cibler une catégorie
# AND cc.path LIKE '%/1055%' -- Pour cibler une catégorie
A celle-ci :
-- On défini ici les valeurs (variables) à utiliser dans la requête
-- Fonctionne depuis MySql 8.0 et MariaDB 10.2
-- Si besoin, on peut faire les modifications ici (uniquement)
-- Si plus d'une ligne, les suivantes commencent par une virgule
-- Attention : pas 2 fois la même variable (commenter l'autre) !
WITH my AS ( SELECT
'%droit%' AS ChaineCours -- Pour cibler les cours
#,'%/1055/1057%' AS CheminCat -- Pour cibler la catégorie
,'%/1055%' AS CheminCat -- Pour cibler la catégorie (remplacer ligne dessus)
) -- Fin des valeurs personnalisées (on les appelle avec my.NomVariable)
-- On écrit la requête principale (pas besoin d'en modifier les valeurs)
SELECT
cc.path,cc.name,c.fullname,FROM_UNIXTIME(c.startdate)
FROM my -- Pour intégrer les valeurs (variables) définies en haut
JOIN prefix_course AS c
JOIN prefix_course_categories AS cc ON cc.id = c.category
WHERE c.shortname LIKE my.ChaineCours -- Pour cibler les cours
AND cc.path LIKE my.CheminCat -- Pour cibler une catégorie
Alors effectivement, vu ainsi, on ne saisi pas trop l'intérêt (d'autant que c'est très long avec mes différents commentaires), mais lorsqu'on utilise des requêtes qui sont très longues, voire certains éléments utilisés plusieurs fois, on gagnera en lisibilité et facilité d'évolution (travailler sur des valeurs différentes) en modifiant les éléments en tête de requête plutôt qu'au sein de la requête.
Séverin