Určite ste aj vy potrebovali (tak ako ja) výpis z databázy do viacerých úrovní. Pri surfovaní po internete som našiel mnoho skriptov, ktoré využívali rekurziu, ale tým vzniklo mnoho zbytočných dotazov na databázu, čo môže spôsobiť veľké vytaženie. Ja preferujem spôsob, ktorý vyžaduje len jeden dotaz. Nevýhodou zas môže byť vyťaženie pamäti pri veľkom množstve dát.
Táto metóda tiež využíva rekurziu, ale s jedným rozdielom. Použijeme iba jeden výber z databázy. Dáta uložíme do dvoch polí, ktoré budeme neskôr vypisovať pomocou pripravenej funkcie. V prvom rade si musíme navrhnúť databázu. Okrem stĺpcov id a name budeme využívať stĺpec parent resp. rodič.
| ID | PARENT | NAME |
| 1 | 0 | 1 |
| 2 | 0 | 2 |
| 3 | 1 | 1.1 |
| 4 | 1 | 1.2 |
| 5 | 4 | 1.2.1 |
| 6 | 4 | 1.2.2 |
| 7 | 2 | 2.1 |
Ako som už spomínal, v prvom rade vyberieme dáta z databázy a uložíme do dvoch polí. ROzdelené podľa toho, či sú najvyššej úrovni, alebo nie.
Ak by šlo napr. o reakcie k článkom, stačí pridať nejakú podmienku vyhovujúcu potrebám (príkladom "WHERE article_id = $id")
Teraz sa dostaneme k samotnému výpisu. Ja som zvolil na ukážku vypís do zoznamu. Ten si potom môžete podľa vlastných potrieb zmeniť. Definujeme si potrebnú funkciu s rekurziou.
Potom už len zavoláme funkciu gettree() ohraničenú zoznamom.
Výsledok scriptu vyzerá nasledovne
|
LIMIT | Maro | 15. októbra 2009 o 10:09:54Čau Emer, dík za skript, je jednoduchý a prehľadný. Len mam jeden problém... chcem vypísať len časť záznamov (nultej úrovne). Teda niečo ako LIMIT 0, 10... skúšal som to rôznymi spôsobmi, ale neviedlo to nikam.
Nevedel by niekto poradiť?
Ďakujem, Marek.
RE: LIMIT | emer | 16. októbra 2009 o 17:54:20Ahoj, ak chceš vypísať limitovaný počet záznamov nultej úrovne, stačí upraviť dotaz.
SELECT * FROM table_name WHERE parent = 0 LIMIT 0,10
Na tomto blogu su vyjadrené moje myšlienky, názory a postoje k určitým veciam alebo udalostiam. Preto upozorňujem, že to čo tu napíšem nemusí byť 100% pravda a aj ja sa môžem zmýliť, alebo mať odlišný názor na vec. Texty neprešli jazykovou kontrolou.