Статьи → MySQL → Построение дерева средствами 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
Для построения свернутого дерева, по каким либо узлам не составит труда вставить несколько условий.
MySQL
|
1 Марта, Понедельник |
|
|
Ajax
CSS
JavaScript
Google
php
1C
MSSQL
Маркетинг
MySQL
Web-разработка
SEO
Virus
Заработок
Логотипы
Фирменный стиль
Безопасность
SMO
Хостинг
Аутсорсинг
Сотовая связь
Домены
|