MySQL: найти все конечные узлы поддерева

У меня есть древовидная структура категорий, хранящихся в таблице MySQL с category_id а также parent_id связь. Parent_id = Null соответствует корневому узлу.

Category (category_id, category_name, parent_id)

То, что я пытаюсь сделать, это получить все листовые узлы, которые дают category_id узла. Я следовал этот статья. Здесь обсуждается получение всех листовых узлов с помощью следующего запроса:

SELECT t1.category_name FROM
category AS t1 LEFT JOIN category as t2
ON t1.category_id = t2.parent_id
WHERE t2.category_id IS NULL;

Но я пытаюсь получить листовые узлы поддерева. Например:

введите описание изображения здесь

В вышеприведенной структуре данного узла 3 результаты будут: 9, 10, 7, 11, 12, 13.

Я также попробовал решение, данное здесь: модель смежности, при заданном идентификаторе возвращаются листовые узлы. Но я не могу получить желаемый результат.

Можете ли вы помочь мне найти решение?

3

Решение

О, хорошо … Я нашел решение … Это немного неловко, однако:

SELECT TRIM(RIGHT(TRIM(concat_ws(' ',
ifnull(t1.category_id,''),
ifnull(t2.category_id,''),
ifnull(t3.category_id,''),
ifnull(t4.category_id,'')
)),2)) AS leaf_node
FROM category AS t1
LEFT JOIN category AS t2 ON t2.parent_category = t1.category_id
LEFT JOIN category AS t3 ON t3.parent_category = t2.category_id
LEFT JOIN category AS t4 ON t4.parent_category = t3.category_id
WHERE t1.category_descr = 'Frames';

Это работает до тех пор, пока category_id является < 100, то есть всего две цифры, но это может быть легко адаптировано. Да, совершенно сумасшедшее / неловкое / (вы называете это) решение, но оно работает для моих целей.

1

Другие решения

Если ваши листья упорядочены (т.е. любой ребенок больше, чем его родитель), есть другой способ:

SELECT tree.id FROM tree
LEFT JOIN tree t1 ON (t1.parent_id = tree.id)
WHERE t1.id IS NULL -- all leafs
AND tree.id > 3 -- greater than starting branch
0