Stromové zobrazenie kategórí

Potrebujem pomoct so stromovym zobrazenim kategorii
v tabulke categories mam polozky
id (id_kategorie) , parent_id (id kategorie na ktoru podkategoria naväzuje) , atd.

na konci tohto textu uvediem moj script na zistenie vsetkych podkategorii vybranej kategorie..

napriklad mam strom
Kategorie:

ovocie
-- jablka
---- zrele
---- nezrele
-- hrusky
zelenina
-- mrkva
-- cibula

chcem napriklad zistitvsetky podkategorie z "ovocie". ja som to robil tak ze v cykle viac krat pouzijem MySQL query.
Je to vhodny sposob, alebo existuje nieco jednoduchsie, popripade vhodnejsie?

Dakujem


moj priklad:

$up_level[0]=$_GET[category_open]; //prva kategoria ktora sa ma otvorit

while(count($up_level)!=0)
{

for($k=0;$k<count($up_level);$k++)
{
$show_categories[]=$up_level[$k];
$query="SELECT id, parent_id FROM ".TABLE_CATEGORIES." WHERE (parent_id='".$up_level[$k]."')";
$res2=MySQL_Query("$query") or die(MySQL_Error());

for($j=0;$j<MySQL_Num_Rows($res2);$j++)
{
$id=MySQL_Result($res2,$j,'id');
if($id!="")$level[]=$id;

}
}
$up_level=$level;
unset($level);
}


// v poli $show_categories su vsetky podkategorie vratane vybranej
Ano, rekurze je jedna z možností.

Já toto řeším jinak. Jelikož mnohem častěji se stromová struktura čte, než upravuje/doplňuje, myslím, si, že je rozumnější to udělat tak, že načteš celý strom, nebo větev na jeden SQL dotaz.

Mám takto vyřešenou diskuzi k článkům.

Princip: každá položka má svůj jednoznačný identifikátor. Hloubka úrovně je vyjádřena délkou identifikátoru.

ovocie 00
-- jablka 0000
---- zrele 000000
---- nezrele 000001
-- hrusky 0001
zelenina 01
-- mrkva 0100
-- cibula 0101

Chci-li vypsat vše: SELECT * FROM tad ORDER BY identifikator

Chci-li vypsat ovoce: SELECT * FROM tab WHERE substr(identifikator,2,0) = '00' ORDER by identifikator

Pokud chci odsazovat úrovně, poznám to podle počtu znaků identifikátorů.

Nevýhoda: lze jen omezený počet záznamů v jedné úrovni. Zde od 00 do 99, ale toto lze navýšit zvýšením znaků pro úroveň. Např 000, 000000, 001, 001000, 001001, pak by to bylo 1000 položek.

identifikator mám v MySQL typu VARCHAR.
no, jestli jde o menu, tak to už mám nějakou dobu vyřešené.
Dělal jsem to tak, že jsou položky v tabulce, která má nějaký název, odkaz na rodičovské menu a pořadí pro "sourozence". Pokud je tento odkaz null, tak je to kořenové menu. Pokud ne, připojí se k nějakému rodičovskému.
Načítá se jedním dotazem do db a nastrká se do vícerozměrného pole
Je tam pořešené i sbalování a rozbalování a jiné kravinky.
Viz http://markovo.wz.cz/class_doc/ (classes - menu)
Na požádání osvětlím podrobněji.
Takove menu s rozbalovanim mam na strankach, PHP kod samotneho menu vypada asi takto:

initmenu();
strtmnu('Admin');
$odkazphp('pocitadla', 'Počítadla');
$odkazphp('sql_query&query=NOW()&', 'SQL dotaz');
$odkazven('https://mysql.webzdarma.cz/', 'phpMyAdmin');
$odkazphp('navod', 'Návod na správu stránek');
endmnu();
strtmnu('Ladění');
$odkazphp('gestbuk', 'Návštěvní kniha');
$odkazphp('forumaction', 'Forum');
$odkazphp('novinky', 'novinky.php');
endmnu();
strtmnu('Roveři');
$odkazphp('roveri/naseakce', 'Program roverů');
endmnu();
termmenu();

Na pozadani poslu kompletni PHP a CSS zdrojak
Zdarek kolegove. Mohl bych pozadat, jestli byste mi ty zdrojacky neposlali? Email na tomvan@centrum.cz.
Ted to zrovna nepotrebuji, ale planuji delat obchudek s vice kategoriemi a rozbalovaci menu by se hodil. Mam sice vlastni algoritmus menu (stejny princip jako MzM), ale ten design by chtelo vyladit. Hlavne, jak je reseno prepinani z plus na minus.
Diky.
co je přepínání z plus na mínus? Jinak zrojáky máš na tom class_doc. Viz předchozí příspěvek.
Takova blbuska, kdyz kliknes na to plus (u tebe vedle knihy), aby se ti otevrelo podmenu, tak se ti zmeni na minus a naopak. Je to zalezitost javascriptu. Jen jsem nemel cas najit solidni skript.
no, to moje hypermenu je řešené bez JS a to plus-minus tam je. Ale zase je to samý postback... Možná by stálo za to to zajaxovat.
Někde zkusím vystavit příklad.