Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment obtenir uniquement le premier niveau de profondeur des nœuds enfants ?

Voici une solution :

select p1.* from tree_path as p1
left outer join (tree_path as p2 join tree_path as p3 on p2.children = p3.parent)
 on p2.parent = p1.parent 
 and p3.children = p1.children 
 and p2.parent <> p2.children 
 and p3.parent <> p3.children
where p1.parent = 3 and p2.parent is NULL;
+----------+--------+
| children | parent |
+----------+--------+
|        3 |      3 |
|        7 |      3 |
|        8 |      3 |
+----------+--------+

Modifiez le p1.parent=7 et vous obtenez ce résultat :

+----------+--------+
| children | parent |
+----------+--------+
|        7 |      7 |
|       15 |      7 |
|       16 |      7 |
+----------+--------+

Voici comment cela fonctionne :les enfants immédiats sont des descendants où il existe un chemin du parent à l'enfant, mais il n'y a pas de chemin du parent à l'enfant via un troisième nœud. Nous essayons donc de nous joindre à un tel chemin (p2->p3) et si aucun n'est trouvé, alors toutes les colonnes de p2 et p3 seront NULL.