Suite au précédent article sur les hiérarchies avec MySQL, je vais ajouter quelques requêtes pratiques. On utilisera la même table et les mêmes données.

Récupérer le chemin d'un élément

Cet exemple [1] est décrit dans le document qui a initié ce billet ainsi que le précédent. Je le replace ici car il va servir de base aux requêtes suivantes.
Recherchons le chemin pour l'élément E, pour cela, utilisons la requête suivante :

  1. /* Récupération du chemin d'un élément */
  2. SELECT p.name AS NAME
  3. FROM tree AS n
  4. , tree AS p
  5. WHERE n.lft BETWEEN p.lft AND p.rgt
  6. AND n.name = 'E'

Ce qui nous donne ceci :

+------+
| NAME |
+------+
| A    |
| B    |
| E    |
+------+
3 rows in set (0.00 sec)

Nous remarquons que le chemin comporte également l'élément sélectionné.

Récupérer le chemin d'un élément sans l'élément

Utilisons la requête suivante :

  1. /* Récupération du chemin d'un élément sans l'élément en question */
  2. SELECT p.name AS NAME
  3. FROM tree AS n
  4. , tree AS p
  5. WHERE n.lft BETWEEN p.lft AND p.rgt
  6. AND n.name = 'E'
  7. AND n.id <> p.id

Ce qui nous donne ceci :

+------+
| NAME |
+------+
| A    |
| B    |
+------+
2 rows in set (0.00 sec)

Récupérer le parent immédiat d'un élément

Utilisons la requête suivante :

  1. /* Récupération du parent immédiat d'un élément */
  2. SELECT p.name AS NAME
  3. FROM tree AS n
  4. , tree AS p
  5. WHERE n.lft BETWEEN p.lft AND p.rgt
  6. AND n.name = 'E'
  7. AND n.id <> p.id
  8. ORDER BY p.lft DESC
  9. LIMIT 1

Ce qui nous donne ceci :

+------+
| NAME |
+------+
| B    |
+------+

Rien de bien compliqué, mais ça dépanne quand on en a besoin.

Notes

[1] Pour le trouver dans la documentation originale, il faut chercher le titre Retrieving a Single Path. Il y a 2 occurrences dans le document, celle qui nous intéresse est la seconde.