http://dev.mysql.com/tech-reso...rticles/hierarchical-data.html
to sto ti imas je "The Adjacency List Model" (nemam ideju kako se zove na srpskom).
ako si jos uvek u fazi modelovanja - ja ti iskreno preporucujem da ides na "The Nested Set Model" posto je znacajno brzi i trosi manje resursa.
u tvom "adjacency list" modelu, ne postoji nacin da izvadis "celo drvo" vec jedan upit moze da ti izvadi drvo do "nekog nivoa dubine" ...
dakle da bi izvadio kategorije do nivoa (dubine) 5 radis self join 4 puta
Code:
SELECT t1.naziv AS nivo1, t2.naziv AS nivo2, t3.naziv AS nivo3, t4.naziv AS nivo4, t5.naziv AS nivo5
FROM kategorija AS t1
LEFT JOIN kategorija AS t2 ON t2.parent_id = t1.kategorija_id
LEFT JOIN kategorija AS t3 ON t3.parent_id = t2.kategorija_id
LEFT JOIN kategorija AS t4 ON t4.parent_id = t3.kategorija_id
LEFT JOIN kategorija AS t5 ON t5.parent_id = t4.kategorija_id
ako oces jos jedan nivo .. dodas jos jedan left join ... i tako koliko ti treba ... kao sto rekoh - smor na kvadrad (to je sa nested set modelom laganica)
ako hoces samo "krajnje" nodove .. dakle kategorije bez podkategorija (sto moze da bude zgodno za forum - ako su poruke samo u kranjim nodovima, mada, gledajuci phpbb na primer to nije tako) onda je to mnogo jednostavnije
Code:
SELECT t1.naziv FROM kategorija AS t1 LEFT JOIN kategorija as t2 ON t1.kategorija_id = t2.parent_id WHERE t2.kategorija_id IS NULL;
sve u svemu ... "smor" ... posebno sto ako nedaj boze ne pazis sta radis i obrises nod koji ima podnodove ... ima da ga nadjes - al nikad .. nested sed rulez kada ga skapiras .. a na linku spocetka posta imas full objasnjenje kako se isti koristi ... to nije samo zgodno u mysql-u vec i ako koristis bilo koji drugi rdbms.
u oraklu, db2 i jos nekim rdbms-ovima bi adjacency list mogao da se iskuca tako da ti vuce celo drvo odjednom ... na primer u oraklu mozes da uradis
Code:
SELECT lpad(' ', (level - 1) * 2) || naziv AS formatiran_naziv, kategorija_id, parrent_id, level
FROM kategorija
CONNECT BY PRIOR kategorija_id = parrent_id
START WITH kategorija_id = 1;
skroz iskusno .. ali
CONNECT BY PRIOR koje ima oracle ce na mysql mozda da dodju sad kada nas je BigO kupio .. no u svakom slucaju, za to ce malo da sacekamo :(