Древовидная структура таблицы mySQL (проблема с выводом дерева)

Drinki

Guest
Древовидная структура таблицы mySQL (проблема с выводом дерева)

Пишу скрипт каталога с древовидной системой. Всё хорошо только вот никак немогу дописать функцию вывода дерева:confused: !!!! У меня видать логического мышления нехватает, а может и знаний... Вобщем у меня есть таблица:

level |parent | title |status|
0 | | NULL |NULL | 2
0_0 | 0 | Раздел1 |folder| 3
0_1 | 0 | Раздел2 |NULL | 0
0_0_2 | 0_0 | Р_1_предмет_1 |NULL | 0
0_0_0 | 0_0 | Р_1_папка_1 |folder| 1
0_0_0_0 | 0_0_0 | Test folder |folder| 0
0_0_1 | 0_0 | Test folder 2 |folder| 0

ВОТ! и такая функция:


PHP:
$listing['catalog'] = $dbt_catalog;//-----таблица
$listing['glue'] = "_";//-----------------символ склеивающий индификатор
$listing['start'] = "0";//---------уровень с которого начинается показ каталога

function catalog_show ($listing){

         $query="SELECT * FROM ".$listing['catalog']." WHERE level='".$listing['start']."'";
         $result=mysql_query($query) or die ("<center>(= &#212;&#238;&#237;&#224;&#240;&#252; =)<br> &#210;&#224;&#234;&#238;&#227;&#238; &#240;&#224;&#231;&#228;&#229;&#235;&#224; &#237;&#229;&#242;!!!!!!!!!!!!!!!!</center>");
         $row = mysql_fetch_array($result);
         echo "<br>";



         for ($i=0; $i < $row['count']; $i++){

             $query="SELECT * FROM ".$listing['catalog']." WHERE level='".$listing['start']."".$listing['glue']."".$i."'";
             $result=mysql_query($query) or die ("<center>(= &#212;&#238;&#237;&#224;&#240;&#252; =)<br> &#210;&#224;&#234;&#238;&#227;&#238; &#240;&#224;&#231;&#228;&#229;&#235;&#224; &#237;&#229;&#242;!!!</center>");
             $row = mysql_fetch_array($result);

             if ($row['status'] == "folder"){
                       echo "+ ";
                       echo "".$row['level']."    ".$row['title']." - ".$row['status']." (".$row['count'].")<br>";
                       
             
                       $listing['start'] = "".$row['level']."";
                       if ($row['count'] > 0){
                       
                       catalog_show ($listing);
                       
                       }
                       
                       
             }
             if ($row['status'] == "item"){
                       echo"&nbsp;       ";
                       echo "".$row['level']."    ".$row['title']." - ".$row['status']." (".$row['count'].")<br>";
                       
                       catalog_show ($listing);
                       
                       
                       
             }

         }

}
и вот что она мне выводит:


+ 0_0 Раздел1 - folder (3)

+ 0_0_0 Р_1_папка_1 - folder (1)

+ 0_0_0_0 Test folder - folder (0)
+ 0_0_1 Test folder 2 - folder (0)


у меня уже мозги выкипели !!!! подскажите плиз как мне её дописать чтоб она всё правильно выодила.....

ЗАРАНИЕ БЛАГОДАРЕН!!!
 

SelenIT

IT-лунатик :)
Drinki
1. Зачем в твоей структуре поле parent, когда абсолютно вся информация о положении элемента в дереве уже есть в поле level?
2. Если в каждой ветви не более 10 потомков, все элементарно выведется в один запрос
PHP:
$query="SELECT * FROM ".$listing['catalog']." WHERE level LIKE '".$listing['start']."%' ORDER BY level";
Если "детей" больше - возникнет проблема с сортировкой (level сортируется как строки). Возможно, лучше сразу выделить по 2 цифры на номер ветви.
3. У данного способа хранения деревьев (Materialized Path, если не путаю) немало недостатков. Будь готов к трудностям, если приедтся перемещать узлы дерева (нужно будет переписывать поле level для всех потомков перемещаемого узла), а также к "тормозам", если дерево разрастется (т.к. поиск и сортировка ведутся не по числовому, а по текстовому полю).

Лучше действительно сразу поизучай другие способы хранения деревьев - тот, что тебе рекомендуют выше, либо на худой конец обычный Adjacency List (для начала).
 

Drinki

Guest
SelenIT

Автор оригинала: SelenIT
Drinki
Лучше действительно сразу поизучай другие способы хранения деревьев - тот, что тебе рекомендуют выше, либо на худой конец обычный Adjacency List (для начала).
БЛИН! ВСЁ ЭТО ТАК УМНО ЗВУЧИТ..... вообщето я изучаю всё это только 5й день. Не могли бы мне посоветовать где можно найти более подробные мануалы по какимнибудь более полезным методам?!!
 

SelenIT

IT-лунатик :)
Drinki

Подборка ссылок есть в Избранном на этом форуме. Красивое, на мой взгляд, решение для работы с простейшей структурой дерева id-parentid (это и есть Adjacency List) предложено здесь: http://forum.dklab.ru/php/heap/HierarchicalStructuresInADb.html.

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

Drinki

Guest
большое всм спасибо!!!

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

вобщем спасибо!
 

SelenIT

IT-лунатик :)
_RVK_
Исправил. Это автоматическое формирование ссылок ненужную точку в URL прихватило...

Drinki
Это ни в коем случае не было тебе в укор. Тем более если ты сам до такой структуры додумался ;)
 

stanlee

Новичок
лучше чем Nested Sets я ничего не встречал
но изза сортировки на уровне все летит в трубу

если те она не нужна то смело пользуй - мощный подход
 

stanlee

Новичок
всмысле новый термин?

id | left | rigth | level | priority

по умолчанию дерево выводится через SELECT * FROM ORDER BY left

но вот еще пересортировать на каждом уровне по полю priority у меня чет не получалось и не получается
 

stanlee

Новичок
дык это уже терлось и причем оч даже горячо
но никто как и не пришел к выходу кроме премещения 2 разделов между собой
но это не юзабельно в корне

да и молдчат все на тему друвок что то - походу больная тема для многих :)))
рекурсия спасает но это же изврат - так и сижу на изврате пока :(
 

_RVK_

Новичок
я к тому что сложность сортировки не является отличительной особенностью Nested Sets.
 
Сверху