Requête SQL récursive parent-enfant dans MySQL / MariaDB
J’ai appris le SQL en 1988, au cours de ma formation Administrateur de Bases de Données au GRETA Elbeuf Vallée de Seine. Je me souviens encore de la galère, lorsqu’il m’a fallu à écrire ma 1ère requête imbriquée. Ce n’était rien à côté de l’écriture de la requête ci-dessous dont l’objet est d’afficher dans la même colonne le chemin complet de l’adresse des pages d’un site WordPress. L’exemple ci-dessous est une requête récursive, s’appuyant sur les CTE Common Table Expressions. L’intérêt est d’avoir évité le recours à une procédure stockée, extrêmement fastidieuse à écrire.
Les valeurs « parentes »
Dans l’exemple ci-dessous, la 1ère requête contient la liste des pages parentes.
La requête récursive
La 2e requête, après l’opérateur ensembliste UNION, opère la jointure entre les résultats de la requête définie dans le WITH avec la liste des valeurs des pages enfantes.
WITH RECURSIVE urls AS ( SELECT parent.ID AS id, parent.post_parent AS parent, parent.post_name AS url, parent.post_type,parent.post_status AS status FROM wp_posts as parent WHERE parent.post_parent=0 AND parent.post_type='page' AND parent.post_status='publish' UNION SELECT enfant.ID AS id, enfant.post_parent AS parent, CONCAT(urls.url,'/',enfant.post_name) AS url, enfant.post_type AS type, enfant.post_status AS status FROM urls INNER JOIN wp_posts AS enfant ON enfant.post_parent=urls.id WHERE enfant.post_type='page' AND enfant.post_status='publish' ) SELECT CONCAT('https://www.dsfc.net/',url,'/') AS url FROM urls ORDER BY url;
Le résultat est à la hauteur de mes espérances. Je m’en suis servi pour construire mon fichier urllist.txt.