Това е просто модел на съседство маса? Тогава не е възможно в една заявка без да се знае максималната дълбочина.
Храна за размисъл е Управление на йерархични данни в MySQL (въпреки че не препоръчвам използването на модела на вложен набор за данни, които се променят редовно).
С много (леви) съединения, по-конкретно:с толкова леви съединения, колкото е максималната дълбочина на дървото, това ще бъде възможно в една заявка. Това е причината много хора да са склонни да запазват „дълбочината“ на конкретна категория, така че ще можете да филтрирате и ограничавате количеството присъединявания към една и съща таблица до по-разумно количество.
Лично, за редовно променяне на данни:склонен съм да конфигурирам задействане при вмъкване/актуализация, което ще запише/кешира текущия „път“ на възел въз основа на идентификатори (например:пътят е „12/62/28/345“ ', в която всяка стъпка между разделителя /
е първичният ключ на родителски възел в правилния ред (родителят на 345 е 28, родител на 28 е 62 и т.н.)), така че мога да го потърся само с едно присъединяване по този начин (/ се използва като разделител):
SELECT j.*
FROM tablename o
JOIN tablename j
WHERE j.path LIKE CONCAT (o.path,'/%')
AND j.id != o.id -- skip parent asked for.
WHERE o.id = <the id of the node you're looking for>;