Du vil højst sandsynligt lave indlejrede sæt. De er lidt vanskelige at få sat op, men gør forespørgslerne MEGET enklere. Så i stedet for kategori forælder, vil du have to kolonner - lft
og rgt
. Venstre og højre er dybest set grænserne for en kategori, hvis et elements kategori-id er mellem disse værdier, ved du, at det er et barn af den kategori.
+----+----------------+-----+------+| id | kategorinavn | lft | rgt |+----+--------------+-----+------+| 1 | biler | 1 | 24 |+----+---------------+-----+------+| 2 | bmw | 2 | 3 |+----+---------------+-----+------+| 5 | audi | 4 | 23 |+----+---------------+-----+------+| 6 | 100 | 5 | 6 |+----+---------------+-----+------+| 7 | 80 | 7 | 8 |+----+---------------+-----+------+| 8 | A4 | 9 | 22 |+----+---------------+-----+------+| 9 | TDI | 10 | 11 |+----+---------------+-----+------+| 10 | Quatro | 12 | 21 |+----+---------------+-----+------+| 11 | Sort | 13 | 18 |+----+---------------+-----+------+| 12 | Hvid | 19 | 20 |+----+---------------+-----+------+| 13 | 2 døre | 14 | 15 |+----+---------------+-----+------+| 14 | 5 døre | 16 | 17 |+----+---------------+-----+------+
Så, for at få antallet af varer i bilkategorien, kan du gøre det super enkelt sådan her:
VÆLG categories.name, items.id, items.category_id, items.name FRA kategorier LEFT JOIN items ON (items.category_id MELLEM categories.lft OG categories.rgt) HVOR categories.category_name ='biler'
Du kan selvfølgelig bare ændre værdien af category_name
og få varerne i ENHVER kategori.
Beklager, af en eller anden grund roterede billedet, da jeg uploadede det her, men hvis du tegner dine kategorier som cirkler og derefter nummererer linjerne, kan du se, hvad værdien skal være for venstre og højre.
Jeg lavede kun biler, da jeg regnede med, at man kunne ekstrapolere for at få de andre kategorier.
Så hvis du skriver dine kategorier sådan her:
Biler(BMW(), Audi(100(),80(),A4(TDI(),Quatro(Sort(2dr(),5dr()), Hvid())))
Så kan du mærke din parentes med tal:
Biler[1]->(BMW[2]->()<-[3], Audi[4]->(100[5]->()<-[6],80[ 7]->()<-[8],A4[9]->(TDI[10]->()<-[11],Quatro[12]->(Sort[13]->(2dr[14] ]->()<-[15], 5dr[16]->()<-[17])<-[18], Hvid[19]->()<-[20])<-[21] )<-[22])<-[23])<-[24]
Eller hvis du kortlægger det som et træ, kan du mærke det sådan her, hvor du mærker noden længst til venstre med et tal og først mærker den højre node, når du har mærket alle dens børn: