[ Rodja_ki @ 21.02.2013. 08:47 ] @
Pozdrav ljudi, imam dva pitanja za vas! :) imam tabelu u bazi koja je hijerarhijski nastrojena, i hteo bih da napravim breadcrumb na osnovu nje (ne na osnovu foldera i stranica u njima). Da prilikom odabira nekog proizvoda putanja do tog prioizvoda bude iscitana iz baze, npr proizvodi->sportska oprema->patike->reebok. Kako doci do toga?
Drugo pitanje je, hteo bih da klikom na link nekog dela iz putanje npr sportska oprema, da se na strani proizvodi.php iscitaju svi proizvodi koji su u toj hijerarhijskoj grani tabele. Znaci sve sto spada u sportsku opremu (moze biti i nekoliko grupa i podgrupa tipa patike, kopacke, dresevi i sl). Kako da se svi proizvodi tih grupa ispisu na toj strani? :) nadam se da sam dobro objasnio sta vas pitam. :)
[ vilyu @ 21.02.2013. 17:36 ] @
Za oba problema imas dva pristupa:
1. Rekurzija: Za breadcrumbs trazis parent-a u svakoj iteraciji, dok ne stignes do vrha. Za listu proizvoda u svakoj iteraciji citas novi podnivo, poput: SELECT * FROM table WHERE idParent IN (x, y, z). Ovde je mana veci broj sukcesivnih upita.
2. Nested set model: Obidjes drvo record-a, ubelezis Left i Right vrednost za svaki record, i trazenje svih predaka, odnosno sve dece dobijas u jednom upitu. Za breadcrumbs:
Code (sql):
SELECT * FROM TABLE WHERE Lft <= targetLeft AND Rgt >= targetRight
Za proizvode:
Code (sql):
SELECT * FROM TABLE WHERE Lft >= targetLeft AND Rgt <= targetRgt
[ Rodja_ki @ 24.02.2013. 23:45 ] @
Malo mi je nerazumljiv ovaj drugi deo, moze li malo opsirnije objasnjenje?
[ vilyu @ 25.02.2013. 16:37 ] @
Recimo da imas drvo:
Code:
    A
  /   \
 B     C
/ \   / \
D  E  F  G

Krenes da ga obilazis i redom dodeljujes brojeve.
Code:
      1A14
   /         \
  2B7        8C13
 /   \      /     \
3D4  5E6  9F10  11G12

Dakle, u tabelu koja ima kolone idCvor, Lft, Rgt upises:
('A', 1, 14), ('B', 2, 7), ...

Ako trazis breadcrumb za cvor E, onda onaj prvi upit izgleda:
Code (sql):
SELECT * FROM TABLE WHERE Lft <= 5 AND Rgt >= 6 ORDER BY Lft

I dobijes:
A 1 14
B 2 7
E 5 6

Sve u jednom upitu. Losa strana ovog sistema je sto insert i update traju dugo, jer moras sve cvorove desno od ciljanog da azuriras (Lft = Lft + 2, Rgt = Rgt + 2), pa da na prazno mesto upises novu vrednost.

Ako i dalje nesto nije jasno, pitaj.