Я удивлен, что никто не упомянул решение материализованный путь , которое, вероятно, является самым быстрым способом работы с деревьями в стандартном SQL.
В этом подходе у каждого узла в дереве есть столбец путь , где хранится полный путь от корня до узла. Это включает в себя очень простые и быстрые запросы.
Взгляните на таблицу примеров узел :
+---------+-------+
| node_id | path |
+---------+-------+
| 0 | |
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 1.4 |
| 5 | 2.5 |
| 6 | 2.6 |
| 7 | 2.6.7 |
| 8 | 2.6.8 |
| 9 | 2.6.9 |
+---------+-------+
Чтобы получить дочерние элементы узла x , вы можете написать следующий запрос:
SELECT * FROM node WHERE path LIKE CONCAT((SELECT path FROM node WHERE node_id = x), '.%')
Имейте в виду, что столбец path должен быть проиндексирован, чтобы выполнить быстро с предложением LIKE .