Создание сайтов

Реклама в интернете

Графический дизайн

Фирменный стиль

 



Статьи → 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 Хостинг Аутсорсинг Сотовая связь Домены

 
 
 
© 2006-2016 Веб-студия «Софт-Арт»
Создание сайтов в Ростове
(863) 2-098-456
support@soft-art.ru