В Интернете можно найти много примеров построения деревьев в различных связках 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
Для построения свернутого дерева, по каким либо узлам не составит труда вставить несколько условий.
Источник http://soft-art.ru