materialized path и сортировка

zerkms

TDD infected
Команда форума
materialized path и сортировка

Здравствуйте господа.
Реализован materialized path (как http://sub.rambler.ru/read/rambler.computer.soft.webdevelopment/?date=2005-02-16&time=13:05)
т.е. структура хранится в поле path в виде 1/2/3/4 (список PK)

Задача 1: вывести всё дерево, отсортировав узлы по алфавиту (по имени узла, поле `name`).
Задача 2: вывести всё дерево, отсортировав узлы по произвольному закону (с помощью поля order или RAND() или нескольких полей)

Есть ли приемлемые решения?
 

pilot911

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

zerkms

TDD infected
Команда форума
pilot911
это одно из решений. в аське со знакомым сгенерил более простое и быстрое. пока говорить не буду - хочу посмотреть мнения форумчан. структура на всякий случай:

`id` INTEGER(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`level` INTEGER(11) UNSIGNED DEFAULT NULL,
`path` TEXT COLLATE utf8_general_ci,
 

pilot911

Новичок
Автор оригинала: zerkms
pilot911
это одно из решений. в аське со знакомым сгенерил более простое и быстрое. пока говорить не буду - хочу посмотреть мнения форумчан. структура на всякий случай:

`id` INTEGER(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`level` INTEGER(11) UNSIGNED DEFAULT NULL,
`path` TEXT COLLATE utf8_general_ci,
`path` TEXT - это очень медленно, больше, чем на порядок медленнее CHAR

имхо, даже если предположить, что в таблице будет 10млн записей, char(255) хватит на 30 уровней вложенности
 

zerkms

TDD infected
Команда форума
pilot911
тип поля имеет какое-то отношение к вопросу?
 

zerkms

TDD infected
Команда форума
`path` TEXT - это очень медленно, больше, чем на порядок медленнее CHAR
кстати, в какой момент? в момент выгребания записей из фс в условиях не FIXED ROW?
 

zerkms

TDD infected
Команда форума
если задать индекс для TEXT на первые N символов, скорости с CHAR сравняются
индекс есть :) а вот производительность не сравняется - особенно в части LIMIT.

но это уже не в тему. по ТС посту есть ещё мысли? :)
 

pilot911

Новичок
Автор оригинала: zerkms
индекс есть :) а вот производительность не сравняется - особенно в части LIMIT.

но это уже не в тему. по ТС посту есть ещё мысли? :)
если бы не было пхпклаба, я бы добавил поле PID и, получив от мускуля все дерево, отсортированное по order или title, запустил рекурсию :)
 

zerkms

TDD infected
Команда форума
pilot911
есть решение без рекурсии и добавления полей :)
 

rotoZOOM

ACM maniac
Задача 1: допустим сортировкой займется mysql, вывод дерева без рекурсии очень просто осуществить, зная, что все ветки будут отсортированы в алфавитном порядке. Псевдокусок:
PHP:
while ($mas=$recordset->getResultAssoc())
{
    $arr=explode('/',$mas['path']);
    $nlevel=count($arr)-1;
    echo str_repeat ('-',4*$nlevel).$arr[$nlevel].'<br />';
}
 

zerkms

TDD infected
Команда форума
rotoZOOM
да это я не указал вначале, думал это понятно. уточнил теперь :)
 

rotoZOOM

ACM maniac
А сортировка по полю `name` будет глобальной по всему дереву, или внутри каждого узла? Для примера:
(name, path)
(Страны, 1)
(Россия, 1/2)
(Иркутск, 1/2/3)
(Комсомольск-на-Амуре, 1/2/4)
(Екатеринбург, 1/2/5)
(Украина, 1/6)
(Донецк, 1/6/7)
(Апрелевка, 1/2/8)

Если отсортировать их по полю `name` то получится:
(Апрелевка, 1/2/8)
(Донецк, 1/6/7)
(Екатеринбург, 1/2/5)
(Иркутск, 1/2/3)
(Комсомольск-на-Амуре, 1/2/4)
(Россия, 1/2)
(Страны, 1)
(Украина, 1/6)

Как в этом случае должно выглядеть дерево?
 

zerkms

TDD infected
Команда форума
в пределах 1 уровня должно сортироваться.

Страны
- Россия
-- Ап
-- Ек
-- Ир
-- Ко
- Украина
-- До
 

pilot911

Новичок
а если сортировать по имени и левелу, то получим

имя левел

Страны 1
- Россия 2
-- Ап 3
-- Ек 3
-- Ир 3
-- Ко 3
- Украина 2
-- До 3


другой вопрос, что не очевидно, как строить дерево... если бы был PID - было бы проще
 

rotoZOOM

ACM maniac
pilot911 Это как это у тебя так получилось отсортировать? Покажи ORDER BY этого запроса.
 

pilot911

Новичок
вообще, не понимаю, зачем в path хранить id элемента... есть же это поле id... достаточно заканчивать поле path родителем


тогда без проблем можно ORDER BY path, name
 
Сверху