ugrás a tartalomhoz

Hierarchikus adattárolás - üres ágak szűrése

inf · 2009. Okt. 23. (P), 06.03
Sziasztok!

Van egy táblám, amiben hierarchikus adatszerkezettel van letárolva egy menü. A leveleket szűröm bizonyos dolgok alapján, és azt szeretném, ha csak azok az ágak maradnának a kapott tömbben, amiknek vannak levelei a szűrés után is.

A szűrő kód, amit használok konkrétan ilyen:
  1. Adatbazis::keres(  
  2.     'SELECT  
  3.         csomagolasok.bal, csomagolasok.jobb, csomagolasok.url, csomagolasok.nev  
  4.     FROM  
  5.         csomagolasok  
  6.     WHERE  
  7.         (csomagolasok.jobb-csomagolasok.bal)<>1 OR  
  8.         csomagolasok.csomagolas_id IN  
  9.         (  
  10.             SELECT  
  11.                 csomagolas_kiszerelesek.csomagolas_id  
  12.             FROM  
  13.                 csomagolas_kiszerelesek  
  14.             WHERE  
  15.                 csomagolas_kiszerelesek.kiszereles_id=\'%d\'  
  16.         )  
  17.     ORDER BY  
  18.         csomagolasok.bal ASC',  
  19.     $kiszereles_id  
  20. )  
Itt a csomagolás a hierarchikus, és szűröm a csomagolás kiszerelése alapján. A faágakat szándékosan meghagytam ((csomagolasok.jobb-csomagolasok.bal)<>1 OR), mert a megjelenítésnél szükség van rájuk, viszont az üres ágakat valahogy ki szeretném szedni, mert sokkal egyszerűbb lenne úgy az élet a sablonozásnál.

Próbálkoztam php-vel, de nem látom át, hogy milyen logika alapján lehetne kiszedni az üres ágakat. Nem tudom, hogy mysql-ben lehetséges-e (nem látok rá sok esélyt), de mindegy is. A lényeg, hogy kéne egy kis segítség, mert adatbázisokkal még nagyon nem vagyok toppon.
 
1

Fordított sorrend

inf · 2009. Okt. 23. (P), 06.30
Nos, ahogy nézem szűrésnél bal szerint csökkenő sorrendben érdemes bejárni, mert akkor a levelekkel kezdünk mindig, és nem az ágakkal, szóval meg lehet mondani, hogy egy ágnak van e levele. Többre még nem jutottam. A gondom az elágazásokkal van. Ha egy ágon csak olyan ágak vannak, amiken nincsenek levelek, akkor nyilván a nagyobb ágnak is el kell tűnnie. Ennek a logikája viszont nekem most túl bonyolult, na megyek aludni, hátha pihenten jobban fog menni...
2

Megoldás php-vel

inf · 2009. Okt. 23. (P), 08.21
  1. $level_bal=$menupontok[0]['jobb'];  
  2. for ($i=count($menupontok)-1; $i>=0; --$i)  
  3. {  
  4.     $bal=$menupontok[$i]['bal'];  
  5.     $jobb=$menupontok[$i]['jobb'];  
  6.     $level=($jobb-$bal)==1;  
  7.     if ($level)  
  8.     {  
  9.         $level_bal=$bal;  
  10.     }  
  11.     elseif($level_bal>$jobb || !$level_bal)  
  12.     {  
  13.         unset($menupontok[$i]);  
  14.     }  
  15. }  
Egyébként úgy vettem észre, hogy fordított sorrenddel a kiírásnál sem kell annyit agyalni a logikán.