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:

Adatbazis::keres(
	'SELECT
		csomagolasok.bal, csomagolasok.jobb, csomagolasok.url, csomagolasok.nev
	FROM
		csomagolasok
	WHERE
		(csomagolasok.jobb-csomagolasok.bal)<>1 OR
		csomagolasok.csomagolas_id IN
		(
			SELECT
				csomagolas_kiszerelesek.csomagolas_id
			FROM
				csomagolas_kiszerelesek
			WHERE
				csomagolas_kiszerelesek.kiszereles_id=\'%d\'
		)
	ORDER BY
		csomagolasok.bal ASC',
	$kiszereles_id
)
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

$level_bal=$menupontok[0]['jobb'];
for ($i=count($menupontok)-1; $i>=0; --$i)
{
	$bal=$menupontok[$i]['bal'];
	$jobb=$menupontok[$i]['jobb'];
	$level=($jobb-$bal)==1;
	if ($level)
	{
		$level_bal=$bal;
	}
	elseif($level_bal>$jobb || !$level_bal)
	{
		unset($menupontok[$i]);
	}
}
Egyébként úgy vettem észre, hogy fordított sorrenddel a kiírásnál sem kell annyit agyalni a logikán.