Цитата:
Сообщение от Sirin
Ну и?..
|
И решил, что убить еще один проект - смысла нет в общем-то, по этому функционал будет включен в состав соц.сети...
...
Пример по выше написанному:
Допустим есть некоторая абстрактная книга "Шу и вайтмары". У нее уникальный альяс = Шу. У нее есть 3 главы: г.1, г.2, г.3. Вторая глава имеет содержательную часть.
В базе это выглядит так:
(id, alias, level, lkey, rkey)
1, Шу, 0, 1, 8
2, Г1, 1, 2, 3
3, Г2, 1, 4, 5
4, Г3, 1, 6, 7
Плюс вторая глава имеет содержательную часть:
Код HTML:
<context>
<p>Шу</p>
<p>Еж</p>
<p>Пыш</p>
<p>Винни</p>
</context>
...
Допустим кторо вводит "Шу.2.3".
По первому индексу (Шу) мы можем получить точное указание на головной узел (узел с id = 1), а все последующие индексы являются по сути смещениями.
И так, мы получили указание на узел:
1, Шу, 0, 1, 8
и далее нам надо получить нечто с индексом 2, являющееся дочерним по отношению к полученному узлу? Что мы делаем? Правильно - первым делом контролируем выдачу, все дочерние узлы должны укладываться в правило - их левый ключ больше левого ключа головного узла, а правый ключ меньше правого ключа головного узла.
И так - ищем второй дочерний элемент по отношению к головному: мы точно знаем, что если уровень (level) головного = 0, то уровень его дочерних равен 0 + 1, то есть выбираем только из элементов с level = 1. Получаем 3 элемента. Нужен второй. Лимитами второй элемент получается элементарно.
И так общее правило - level = root.level + 1, lkey > root.lkey, rkey < root.lkey, limit index - 1, 1, при порядке сортировки по левому ключу...
То же самое верно для поиска третьего индекса, четвертого, пятого и всех остальных...
И так мы нашли элемент:
3, Г2, 1, 4, 5
Его содержательную часть читаем XML-разборщиком и выводим третий по счету узел, получаем - "Пыш".
В случае запроса "Шу.2.3.2" - получим "ы". В случае запроса "Шу" - получим дерево глав. В случае запроса "Шу.2" - получим все содержание второй главы.
... ... ...
На практике - прилетел запрос: "Шу.2.3" - разбиваем го на секции:
PHP код:
$request = 'Шу.2.3';
$section = explode ('.', $request);
Нулевая секция - это всегда уникальный альяс книги, по этому ищем корневой узел этой книги:
PHP код:
$some_database_controller -> query ('
SELECT *
FROM `table_name`
WHERE `name` = "'.$section[0].'"
;');
Дополняем запрос так, чтобы одним запросом получить и второй узел (дочерний):
PHP код:
$some_database_controller -> query ('
SELECT
`level1`.*
FROM `table_name` `root`
LEFT JOIN `table_name` `level1`
ON `level1`.`level` = `root`.`level` + 1 AND `level1`.`lkey` > `root`.`lkey` AND `level1`.`rkey` < `root`.`rkey`
WHERE `name` = "'.$section[0].'"
ORDER BY `level1`.`lkey`
LIMIT '.($section[1] - 1).', 1
;');
И так мы нашли вторую главу...
Следует заметить, что исходя из логики NestedSets - это не будет работать для различного рода структур - то есть - структур то одинаковых не бывает. В случае, когда это будет не применимо к тому, или иному виду структур - можно по альясу корня получить полную структуру и тогда уже на стороне PHP точно вычислить узел пробежкой по массиву.
Так что... Но это по ситуации надо уже смотреть...