Hier is een oplossing:
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 |
+----------+--------+
Verander de p1.parent=7 en je krijgt deze output:
+----------+--------+
| children | parent |
+----------+--------+
| 7 | 7 |
| 15 | 7 |
| 16 | 7 |
+----------+--------+
Dit is de manier waarop het werkt:directe kinderen zijn afstammelingen waarbij er een pad is van ouder naar kind, maar er is geen pad van ouder via een derde knooppunt naar het kind. Dus we proberen ons aan te sluiten bij zo'n pad (p2->p3) en als er geen wordt gevonden, dan zijn alle kolommen van p2 en p3 NULL.