S největší pravděpodobností budete chtít vytvořit vnořené sady. Jejich nastavení je trochu složitější, ale dotazy jsou MNOHEM jednodušší. Takže místo nadřazené kategorie budete mít dva sloupce - lft
a rgt
. Vlevo a vpravo jsou v podstatě hranice kategorie, pokud je id kategorie položky mezi těmito hodnotami, víte, že jde o potomka dané kategorie.
+----+---------------+-----+------+
| id | category name | lft | rgt |
+----+---------------+-----+------+
| 1 | cars | 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 | Black | 13 | 18 |
+----+---------------+-----+------+
| 12 | White | 19 | 20 |
+----+---------------+-----+------+
| 13 | 2 doors | 14 | 15 |
+----+---------------+-----+------+
| 14 | 5 doors | 16 | 17 |
+----+---------------+-----+------+
Poté, abyste získali počet položek v kategorii auta, můžete to udělat super jednoduše takto:
SELECT categories.name, items.id, items.category_id, items.name
FROM categories
LEFT JOIN items
ON (items.category_id BETWEEN categories.lft AND categories.rgt)
WHERE categories.category_name = 'cars'
Samozřejmě stačí změnit hodnotu category_name
a získejte položky v JAKÉKOLI kategorii.
Lituji, z nějakého důvodu se obrázek při nahrání sem otočil, ale pokud své kategorie nakreslíte jako kruhy a poté očíslujete řádky, uvidíte, jaká by měla být hodnota pro levou a pravou stranu.
Auta jsem dělal jen proto, že jsem si myslel, že můžete extrapolovat, abyste získali další kategorie.
Pokud tedy své kategorie napíšete takto:
Cars(BMW(), Audi(100(),80(),A4(TDI(),Quatro(Black(2dr(),5dr()), White())))
Potom můžete svou závorku označit čísly:
Cars[1]->(BMW[2]->()<-[3], Audi[4]->(100[5]->()<-[6],80[7]->()<-[8],A4[9]->(TDI[10]->()<-[11],Quatro[12]->(Black[13]->(2dr[14]->()<-[15], 5dr[16]->()<-[17])<-[18], White[19]->()<-[20])<-[21])<-[22])<-[23])<-[24]
Nebo pokud to znázorníte jako strom, můžete jej označit takto, kde označíte uzel nejvíce vlevo číslem a pravý uzel označíte pouze tehdy, když označíte všechny jeho potomky: