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  / Formateur MariaDB Formateur MySQL Formateur SQL MariaDB MySQL SQL 

Commentaires

Pas encore de commentaire.

Laisser un commentaire

(requis)

(requis)