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.

Les valeurs "parentes" de la requête récursive

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.

La requête récursive

 

Base de données / , , , , ,