Главный Каталог Статей РФ
87238 авторов, размещено 47366 статей, сейчас на сайте пользователей: 586 Статистика
Аватар slayer

Построение дерева средствами MySQL

Категория:  Интернет  | Автор:  slayer | Опубликовано: 19.04.2008

В Интернете можно найти много примеров построения деревьев в различных связках 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

Комментарии
К этой статье пока нет комментариев. Станьте первым! У нас гости не могут комментировать статьи. Пожалуйста авторизуйтесь или зарегистрируйтесь, чтобы прокомментировать.
Интересные статьи по теме
Аватар AnemoN
Накрутка лайков и подписчиков ВКонтакте Есть несколько хитрых и не очень методов, которые используются для т.н. "накрутки лайков".О заслуживающих внимания пойдет речь в этой статье....
Категория: Интернет | Автор: AnemoN | Добавлено: 17.02.2013
Аватар Jetti
Буксы — что это такое и как правильно выбрать букс для заработка Из-за коронавируса, "блуждающего" по всему миру вот уже второй год, у многих людей появилось огромное количество свободного времени. Одни стали тратить это время на хобби, другие — читать книги и смот...
Категория: Интернет | Автор: Jetti | Добавлено: 20.07.2021
Аватар Lizetta
Сколько времени уходит на создание сайта? Сколько времени тратит специалист на разработку сайта? В какой срок можно создать сайт и чем обуславливается это?...
Категория: Интернет | Автор: Lizetta | Добавлено: 03.06.2011
Аватар gul_itb
Как правильно представить информацию на сайте Зачем люди сидят в Интернете? В основном есть две причины – это развлечение и поиск информации. Ваш корпоративный сайт, конечно же тоже служит этим двум целям Интернет-общения. Даже бизнес-сайт о чем-...
Категория: Интернет | Автор: gul_itb | Добавлено: 26.10.2009
Аватар Marta22
Как улучшить страницу на сайте вконтакте Советы, как сделать страницу в vkontakte лучше...
Категория: Интернет | Автор: Marta22 | Добавлено: 21.08.2009
Свежие комментарии
Ну, вот это я понимаю, настоящая инструкция для тех, кто хочет не просто «привет, как дела», а чтобы дамы сами в личку ломились! Как говорится, техник...

Читать >>

Куклы-обереги действительно имеют глубокий символизм и интересную историю, которая часто теряется в современных интерпретациях. Например, многие не зн...

Читать >>

Полностью поддерживаю подход, описанный в статье! Рисование — не просто творческое занятие, а ключевой инструмент для развития ребёнка. Как детский пс...

Читать >>

Интересная подборка ошибок, но не могу не высказать скепсис по поводу части рекомендаций. Например, о зарядке только до 80% — это логично с техническо...

Читать >>

Работал соцработником пару лет, и вот что не написали: это не только помощь людям, но и куча бумажек, отчётов и согласований. Бывает, половина времени...

Читать >>

Лучшие авторы
Аватар НОВА ДИДАКТИК
НОВА ДИДАКТИК – системный интегратор, специализиру...

Читать

Аватар slawa100
Мастер строитель, мой блог о стройке и ремонте bui...

Читать

Аватар ogasoda
Профессиональный копирайтер в настоящее время боль...

Читать

Напишите нам