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