fbpx

Каталог статей

Каталог статей для размещения статей информационного характера

Технології

Побудова дерева засобами MySQL

В Інтернеті можна знайти багато прикладів побудови дерев у різних зв’язках PHP і MySQL, не будемо обговорювати якість виконання поставлених завдань. Побутує така приказка – «Ніж розбиратися в коді іншої людини, краще написати самому». Ось і я вирішив написати код, але використовувати цілком для побудови і сортування дерева тільки кошти MySQL. Відразу обмовлюся в представленому варіанті дерево трьох рівнів без претензії на його унікальність.
Опишемо ситуацію:
Є таблиця categories, що містить наступні поля:
id (код)
id_group (код верхньої групи)
name (найменування)
Необхідно з допомогою запиту побудувати отсортированную таблицю, в якій присутні вихідні поля таблиці і такі як:
level (рівень)
veight (вага, кількість вузлів або листя підлеглих поточного сайту, буду використовувати для відображення дерева)
Для сортування нам потрібні ще й додаткові поля:
top_group (код першого вузла)
sub_group (код вузла другого рівня)
Запит розгорнутого і відсортованого дерева за найменуванням:
select t_top.id t_top.id_group, t_top.name, t_top.level,
IF(t_top.level=1, t_top.id
IF(t_top.level=2,t_top.id_group,
(SELECT c_.`id_group` from categories c_ where c_.`id`=t_top.id_group)
)
) as top_group,
if(t_top.level=1, 0,
IF(t_top.level=2,t_top.id t_top.id_group)
) as sub_group,
(select count(*) from `categories` where id_group=t_top.id) as veight
From
/* В цій частині просто отримуємо рівні */
(
select c.id c.id_group, c.name, 1 as level from categories c where c.id_group=0
UNION ALL
select cc.id, cc.id_group, cc.name, 2 as level from categories cc
where cc.id_group in ( select c.id from categories c where c.id_group=0 order by c.name)
UNION ALL
select ccc.id ccc.id_group, ccc.name, 3 as level from categories ccc
where ccc.id not in ( select c.id from categories c where c.id_group=0 order by c.name)
and
ccc.id not in ( select cc.id from categories cc where cc.id_group in
( select c.id from categories c where c.id_group=0 order by c.name))
) t_top
order by top_group,sub_group, level,name
Для побудови згорнутого дерева, з якихось вузлів не складе труднощів додати кілька умов.
Джерело