Вывод всего Nested sets дерева + сортировка на одном из уровней

idencial

Одинаковый
Вывод всего Nested sets дерева + сортировка на одном из уровней

Есть Nested sets дерево, которое выводится как-то так
PHP:
SELECT * FROM tree ORDER BY cleft ASC
Есть некая доп. таблица, связанная с этой по cat_id, где я могу хранить доп. информацию, в том числе и спец. поля для сортировки
Пусть в этой доп. таблице будет поле sort_order, по которому я хочу сортировать.

Т.е например мне понадобилось отсортировать все элементы 1 уровня (или какой-то отдельной ветки), а все остальные выводить как обычно

Можно это как-то красиво сделать запросом(и) или это лучше (возможно только) сделать оперируя с массивом, в который выгрузить дерево?
 

Wicked

Новичок
может просто поменять узлы первого уровня, используя движок нестед сетс? Чтобы порядок прямо в cleft и был.
 

idencial

Одинаковый
Wicked
Не, там сейчас более 1200 элементов, слишком долго при обновлении пересчитывать дерево будет.
 

alexhemp

Новичок
idencial

Это что нужно каждые 2 минуты делать?

Один раз перемесить и все.
 

idencial

Одинаковый
alexhemp
Нет, не каждые 2 минуты. Но вариант перемещения я оставил на случай, если не будет разумных альтернатив
 

alexhemp

Новичок
В Nested Sets порядок УЖЕ задан, дополнительные поля только все усложнят.

Переставьте узлы в самом дереве, зачем какой-то дополнительный механизм придумывать?
 

idencial

Одинаковый
alexhemp
http://phpclub.ru/faq/wakka.php?wakka=Tree/NsFaq&v=xoz#SortHowTo


Не все так однозначно. Дополнительные поля я создаю не в таблице с деревом и именно для того, чтобы можно было сортировать, причем не обязательно по полю sortorder, а по алфавиту, времени и др. полям.

Другое дело, что пример сортировки, приведенный по ссылке у меня не прокатит, т.к я вывожу все дерево, а сортировать нужно только кусок.
 

alexhemp

Новичок
Ну тогда если не в таблице с деревом - в чем проблема?

При выводе вставь в нужное место выборку из другой таблицы отсортированную как нужно и все.
 

idencial

Одинаковый
При выводе вставь в нужное место выборку из другой таблицы отсортированную как нужно и все.
Так проблема как раз с понятием "нужное место" (их может быть много)
Мне нужно нечто универсальное.
Там в примере сортируют детей конкретной вершины, а мне бы нечто такое, чтобы я мог отсортировать разные ветки по sort_order, а потом вывести целиком все дерево, учтя sort_order

Т.е хочется сохранить удобство вывода всего дерева одним запросом и при этом отсортировать нужные ветки по sort_order.
 

idencial

Одинаковый
Используй функцию if() в условии сортировки
Что-то не врубил как запрос из примера
PHP:
SELECT

t_catalog.i_id,
t_catalog.s_name
FROM

t_tree as t1,
t_tree as t2,
t_catalog
WHERE

t1.i_id=".$i_id." and
t2.i_left between t1.i_left+1 and t1.i_right-1 and
t2.i_level = t1.i_level+1 and
t2.i_id=t_catalog.i_id
ORDER BY

t_catalog.s_name
я могу преобразовать так, что он выведет все дерево, но при этом отсортирует по s_name?
 

idencial

Одинаковый
Т.е для приведенного примера это будет нечто типа
PHP:
SELECT 

t_catalog.i_id, 
t_catalog.s_name 
FROM 

t_tree as t1, 
t_tree as t2, 
t_catalog 
WHERE  
t2.i_id=t_catalog.i_id 
ORDER BY if(t1.i_id=".$i_id." and 
t2.i_left between t1.i_left+1 and t1.i_right-1 and 
t2.i_level = t1.i_level+1, t_catalog.s_name, i_left)
А если мне нужно отсортировать по t_catalog.s_name все дерево?
Т.е не какую-то конкретную ветку, а все ветки в дереве.

P.S.
Если для сортировки конкретного уровня я напишу
ORDER BY if(i_level=1,t_catalog.s_name,i_left), то собъется структура дерева

-~{}~ 06.04.06 01:56:

После сравнения разных вариантов пришел к выводу, что лучше все-таки переместить сами узлы, а не сортировать, ибо перемещать будут не часто.

Возможность перемещения решил сделать по аналогии с сортировкой. Т.е изначально выводится список того, что хотим перемещать, затем человек расстанавливает детей выбранного родителя как ему надо (В спец. списке с помощью JS, без перезагрузки), а потом жмет на изменить.
И после этого я делаю n перемещений и переставляю узлы в соотв. с тем порядком, который он указал через веб-интерфейс.
Единственное, возникают некоторые сложности с алгоритмом, по которому нужно переставлять узлы

Перемещать собираюсь с помощью метода ChangePositionAll класса http://php.russofile.ru/ru/authors/sql/nestedsets01
Если в веб-интерейсе перемещать последовательно, т.е выбрал что перемещать, выбрал куда перемещать - переместил, то все просто.
Но если дать возможность выставить сразу весь порядок, то возникают некоторые сложности с определением того, кого с кем перемещать.
Фактически я имею массив, который вывожу изначально
PHP:
while(!$result->EOF) {
      $sections[] = array("section_id"=>$result->fields['section_id'],"section_name"=>$result->fields['section_name']);
      $result->MoveNext();
}
Затем вывели форму сортировки, человек переставил элементы в нужном ему порядке и нажал изменить.
Я получаю строку, где через запятую указаны id эелементов в том порядке, в котором их выставили.
Как из этого мне вытащить инфу о том, кого с кем переставлять?
 

Rin

*
SQL запрос всегда возвратит плоскую структуру, само дерево вы можете построить на PHP в виде вложенных ассоциативных массивов.
Используя функцию array_multisort_key() вы можете отсортивать нужную ветку.
 
Сверху