Всё-таки, мысли о деревьях не дают мне покоя. Вчера пришла такая мысль: во время добавления нового узла, рекурсивно выбрать узлы и отсортировать их так, как они должны отображаться. Структура базы данных: [sql]CREATE TABLE `tree` ( `id` int auto_increment, -- ID узла `pid` int, -- ID родителя `sort` int, -- Сортировочное поле `childs` int, -- Количество "непосредственных детей" `level` int, -- Уровень PRIMARY KEY (`id`) )[/sql] Здесь, поле `sort` и есть то поле, по которому происходит сортировка. Пересортировка дерева: PHP: <? // Классический вывод дерева, только в нашем случае он возвращает массив ID'шников function get($pid = 0, $ids = array()) { $result = mysql_query("SELECT id, childs FROM tree WHERE pid = $pid ORDER BY id"); while ($row = mysql_fetch_object($result)) { $ids[] = $row->id; if ($row->childs) { $ids = array_merge($ids, get($row->id)); } } return $ids; } $ids = join(", ", get()); mysql_query("SET @i = 0"); // Вся фишка в этом запросе, в котором мы нумеруем узлы в том порядке, в котором они должны отображаться mysql_query("UPDATE tree SET sort = (@i := @i + 1) ORDER BY FIELD(id, $ids)"); ?> Пересортировку необходимо делать только если мы добавляем некорневой узел. В итоге, чтобы вывести дерево достаточно выполнить запрос: [sql]SELECT * FROM tree ORDER BY sort[/sql] Ну как? Сильно не ругайте, я ещё даже не студент. :-Р
проверять лень. 1 и 2 - потомки 0. 3,4 и 5,6 - соответственно потомки 1 и 2. 7,8 9,10 11,12 13,14 - соответственно потомки. как будет выглядеть поле сорт для каждого и как вывести ветвь 3?
Код (Text): sort | id 1 | 1 2 | 3 3 | 7 4 | 8 5 | 4 6 | 9 7 | 10 8 | 2 9 | 5 10 | 11 11 | 12 12 | 6 13 | 13 14 | 14 Ты чего-то такого хотел? Выбрать ветку 3 можно классически - рекурсивно, а можно так: [sql]SELECT @pid := pid, @pos := sort FROM tree WHERE id = 3; SELECT @next_pos := sort FROM tree WHERE pid = @pid AND id > 3 ORDER BY sort LIMIT 1; SELECT * FROM tree WHERE sort > @pos AND sort < @next_pos ORDER BY sort; -- TODO: предусмотреть обработку NULL-значений[/sql] Хочу добавить: цель этого алгоритма - не выбор веток, а быстрый вывод всего или части дерева.
pid - parent id Часть дерева - буквально, "кусок" дерева. Зачем жто нужна? Навеяло длиннющим деревом комментариев на Хабре, "куски" дерева нужны для пагинации.