ugrás a tartalomhoz

Szülő - gyerek kategóriák meghatározása

Johnny · 2007. Okt. 27. (Szo), 23.00
Sziasztok!

Van egy nagyon egyszerű kis adatbázis táblám, így néz ki:

CREATE TABLE `test_categories` (
  `id` int(11) NOT NULL auto_increment,
  `parent_id` int(11) NOT NULL,
  `title` varchar(50) collate utf8_unicode_ci NOT NULL,
  `seftitle` varchar(50) collate utf8_unicode_ci NOT NULL,
  `status` enum('a','p','d') collate utf8_unicode_ci NOT NULL,
  `c_order` int(2) NOT NULL,
  PRIMARY KEY  (`id`)
);
Ebben úgy néznének ki az adatok, hogy a főkategoriák parent_id-ja 0 lenne, míg egy gyerek esetében a parent_id a szülő id értékét veszi fel.
Mondjuk legyenek ilyen adatok:
Szülő:
1,0,Autók,autok,a,1
A hozzátartozó gyerekek pedig:
2,1,Teherautók,teherautok,a,1
3,1,Személyautók,szemelyautok,a,2
4,3,Kispolski,kispolski,a,1
5,3,Trabant,trabant,a,2
6,2,Ifa,ifa,a,1

Ez ugye valahogy így nézne ki ebben az esetben:
Autók
|____Teherautók
.........|__________ Ifa
|____Személyautók
.........|__________ Kispolski
.........|__________ Trabant

Na most, hogyan tudom meghatározni egy adott ág alá tartozó összes ágat? Mondjuk a személyautók esetében?

Tudom, volt itt a weblaboron cikk ebben a témakörben, de valamiért az alapján nem tudtam megoldani.
Előre is köszönök minden ötletet, segítséget.

Ui.: Természetesen nem kész kódrészletet várok, csak egy kis segítséget. :)
 
1

RTFM

janoszen · 2007. Okt. 27. (Szo), 23.58
Nem jó cikket néztél, ha ilyen az adatszerkezeted.Lehet, hogy a másik cikket kellene elolvasni.
2

Próbálkozás

Johnny · 2007. Okt. 28. (V), 00.14
Lehet, hogy én adtam fel tényleg korán.

Valahogy azonban nem látom át a dolgot teljesen.


function find_children($parent_id) {  
global $db, $dbprefix;

// Megkeressük az egy szinttel lejjebb lévő kategóriákat 
$sql = "select id from ".$dbprefix."categories where parent_id='".$parent_id."' and status='a'";
$query = $db->sql_query($sql);
$result = $db->sql_fetchrowset($query);

// Nagyszerűen kiírja az egy szinttel lejjebb lévő kategóriák id-jét
print_r($result);

// Itt kéne tovább menni az egyes alkategóriáknál...


}
find_children(1);

Így próbálkoztam az általad is említett cikk kapcsán, csak valahol elvesztem (a nyilván másoknak nem ennyire bonyolult) részletekben.
3

Nem jó cikk

janoszen · 2007. Okt. 28. (V), 09.16
Nem jó cikket néztél. Ha parentet adsz meg, mysql-ben nem tudsz ilyen lekérdezést csinálni. Az lft-rgt módszert kell használni. Olvasd el a cikk második részét. (Hierarchikus adatkezelés 2) Ott a kész példa.
4

Kategóriák módosítása

Johnny · 2007. Okt. 28. (V), 09.23
Ha ilyen módszert alkalmaznék, akkor szerintem a kategóriák módosítása iszonyatosan körülményessé válna. Nem?
5

tárolt eljárások, teljesítmény

winston · 2007. Okt. 28. (V), 11.06
mivel nem kézzel csinálod, nem :) próbáld meg tárolt eljárással (nézz utána a mysql doksiban: stored function és stored procedure), és akkor már a php-ból is csak egy sql hívással el tudod intézni. a cikkben minden le van írva, emlékeim szerint a teljesítménnyel kapcsolatban is. fontos azonban megjegyezni, hogy egy algoritmusnál több fajta teljesítményt lehet figyelembe venni: hozzáadás, törlés, különböző keresések. neked gondolom az a fontos, hogy a keresés (gyermekk kersése) gyors legyen. erre tökéletes a lft-rgt módszer. az, hogy ha kicsit lassabb a hozzáadás, nem baj, mivel sokkal ritkábban történik. olvasd el a cikket, és előbb próbáld ki az ottani példákat, utána használd a saját rendszerben. (gyorsabb lesz a kereség, mert ugye itt nem rekurzívan kell lekérned a gyermekeket, több lekérésben, mint ha szülőt adsz meg) a tárolt eljárás meg még a sebességen is segít. megj.: lehet csinálni hibrid rendszert is, ahol a szülőket, és a lft-rgt értéket is tárolod, hogy gyorsabban menjenek a dolgok, de ennél nagyon kell figyelni, mert redundánsan tárolod a fa szerkezetés, és ha a két tárolás között eltérés lesz, ott komoly gondok lesznek.