Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Как обойти это дерево?


Автор: Артем125 28.9.2009, 09:37
Привет всем

дано дерево для примера в прикрепленном файле

его необходимо обойти, получая каждую ветку, затем отображать в указанном ниже порядке.

39
|
-----41
        |
        |-----48
                 |
                 |-----52
                 |------54
        |------53
------42
------43
        |-------60

           
 думаю так сделать: одним запросом вытаскиваю самую левую ветку
Код

        $result_t = mysql_query("SELECT t1.sections_name AS lev1, t2.sections_name as lev2, t3.sections_name as lev3, t4.sections_name as lev4 
                                FROM ".TABLE_SECTIONS." AS t1
                                LEFT JOIN ".TABLE_SECTIONS." AS t2 ON t2.sections_parent = t1.sections_parent

                                !!!!Вопрос 2!!!

                                WHERE t1.sections_parent = ".intval($_POST['page_id'])."
                              ");

запоминаю значения в массив 39 41 58 52 54
далее вытаскиваю следующую ветку, сравниваю значения с массивом и вывожу те значения (53), что нет в массиве, 
и т.д.

Правильный ли ход мыслей? и

!!!!Вопрос 2!!! Посмотрите на sql запрос. если средствами php формировать вот эти строки LEFT JOIN ".TABLE_SECTIONS." AS t3 ON t3.sections_parent = t2.sections_parent до тех пор, пока ветка не пройдена до конца, то как узнать в этом запросе сколько таких строк надо?




        

Автор: solenko 28.9.2009, 10:56
Т.к. нужо обойти все дерево, то рационально выбирать ВСЕ данные одним запросом и обрабатывать уже на стороне php.

Автор: Артем125 28.9.2009, 11:00
Тогда впринципе мой запрос подходит, только не знаю как узнать сколько таких LEFT JOIN ".TABLE_SECTIONS." AS t3 ON t3.sections_parent = t2.sections_parent  строк формировать или может как то по другому все данные выцепить в массив?

Автор: Ипатьев 28.9.2009, 11:41
SELECT * FROM table_sections

Автор: capitan 28.9.2009, 11:46
Артем125, 

"Дерево каталогов NESTED SETS (вложенные множества) и управление им "
http://www.getinfo.ru/article610.html

Все остальные варианты хороши на маленьких объёмах. При больших объёмах, скрипты еле ворочаются. 

Автор: Ипатьев 28.9.2009, 11:56
при больших ставках ворочаются, как раз NESTED SETS

Автор: capitan 28.9.2009, 12:10
Ипатьев, Делал каталог товаров с вложенностью категорий. После использования NESTED SETS , все стало гораздо шустрее работать. Кстати в статье куча ошибок в запросах. Пришлось многое переписывать. Единственное что пока не успел реализовать - это сортировку категорий. Не до неё smile Выбор по ключам  в разы шустрее работает.

Автор: Ипатьев 28.9.2009, 12:20
"все стало шустрее работать" - это совсем не показатель.
сделал машину на дровах. после этого пересел на велосипед - стало гораздо шустрее! если кое-кто не умеет делать машины, то это совсем не означает, что они в принципе медленнее велосипеда.

а еще есть мнение, что сами товары и каталог с разделами можно не класть в одну таблицу. и дерево волшебным образом станет маленьким.


Автор: capitan 28.9.2009, 15:20
Ипатьев, товары от категорий разделены. Вложенность присутствует у таблицы с категориями.  Вот их в админке и нужно выводить, чтобы работать. Причем вложенность не ограничена.  По-этому из всех вариантов, выбрал все таки NESTED SETS. Все дерево обходится одним запросом SELECT безовсяких JOIN и UNION.

Автор: Ипатьев 28.9.2009, 15:23
Цитата(capitan @  28.9.2009,  15:20 Найти цитируемый пост)
Вложенность присутствует у таблицы с категориями. 

В этом случае она небольшая, и nseted sets не представляет никаких преимуществ по сравнению с другими способами.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)