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:
  1. CREATE TABLE `test_categories` (  
  2.   `id` int(11) NOT NULL auto_increment,  
  3.   `parent_id` int(11) NOT NULL,  
  4.   `title` varchar(50) collate utf8_unicode_ci NOT NULL,  
  5.   `seftitle` varchar(50) collate utf8_unicode_ci NOT NULL,  
  6.   `status` enum('a','p','d'collate utf8_unicode_ci NOT NULL,  
  7.   `c_order` int(2) NOT NULL,  
  8.   PRIMARY KEY  (`id`)  
  9. );  
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.
  1. function find_children($parent_id) {    
  2. global $db$dbprefix;  
  3.   
  4. // Megkeressük az egy szinttel lejjebb lévő kategóriákat   
  5. $sql = "select id from ".$dbprefix."categories where parent_id='".$parent_id."' and status='a'";  
  6. $query = $db->sql_query($sql);  
  7. $result = $db->sql_fetchrowset($query);  
  8.   
  9. // Nagyszerűen kiírja az egy szinttel lejjebb lévő kategóriák id-jét  
  10. print_r($result);  
  11.   
  12. // Itt kéne tovább menni az egyes alkategóriáknál...  
  13.   
  14.   
  15. }  
  16. 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.