Emerkove osobne stránky - Miroslav Rác

RSS
  10. august 2009

Stromová štruktúra pomocou jediného dotazu

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č.

IDPARENTNAME
101
202
311.1
411.2
541.2.1
641.2.2
722.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.

  • $Select = mysql_query("SELECT * FROM table_name");
  • while($Row = mysql_fetch_assoc($Select)){
  •   if($Row['parent'] == 0){
  •     $Arr[$Row['id']] = $Row['name'];
  •   }else{
  •     $Childs[$Row['parent']][$Row['id']] = $Row['name'];
  •   }
  • }

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.

  • function gettree($Array){
  •   global $Childs;
  •   foreach($Array as $key => $value){
  •     echo '<li>'.$value.'</li>';
  •     if(isset($Childs[$key])){
  •       echo '<li><ul>';
  •       gettree($Childs[$key]);
  •       echo '</ul></li>';
  •     }
  •   }
  • }

Potom už len zavoláme funkciu gettree() ohraničenú zoznamom.

  • echo '<ul>';
  • gettree($Arr);
  • echo '</ul>';

Výsledok scriptu vyzerá nasledovne

  • 1
    • 1.1
    • 1.2
      • 1.2.1
      • 1.2.2
  • 2
    • 2.1

Článok napísal Miroslav Rác 10. augusta 2009
vybrali.sme.sk


Airweb.sk - creative web solutions
2 príspevky

Diskusia

LIMIT | Maro | 15. októbra 2009 o 10:09:54 | Hodnotenie: 2.07-+Č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:20 | Hodnotenie: 2.07-+Ahoj, ak chceš vypísať limitovaný počet záznamov nultej úrovne, stačí upraviť dotaz.

SELECT * FROM table_name WHERE parent = 0 LIMIT 0,10

Pridať komentár

Meno:
Predmet:
Text:Kontrola proti spamu
Menu Vyhľadávanie
  • Na stránke momentálne nie je možné vyhľadávať
Moje poznámky
  • 16. marca 2010 o 11:58:46:
    Na hodnotenie komentárov som použil správny výpočet podľa vzorcu uvedenom v dosť poučnom článku. Viac v rubrike Oplatí sa vidieť.
  • 1. januára 2010 o 13:29:02:
    Prajem vám šťastný a hlavne úspešný nový rok :)
  • 12. decembra 2009 o 23:51:55:
    Predmet v komentároch je už naozaj nepovinný :)
Používatelia
  • Je tu prítomných 1 používateľov.
emer, 2010

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.