У меня есть древовидная структура категорий, хранящихся в таблице 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.
Я также попробовал решение, данное здесь: модель смежности, при заданном идентификаторе возвращаются листовые узлы. Но я не могу получить желаемый результат.
Можете ли вы помочь мне найти решение?
О, хорошо … Я нашел решение … Это немного неловко, однако:
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, то есть всего две цифры, но это может быть легко адаптировано. Да, совершенно сумасшедшее / неловкое / (вы называете это) решение, но оно работает для моих целей.
Если ваши листья упорядочены (т.е. любой ребенок больше, чем его родитель), есть другой способ:
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