Najprawdopodobniej chciałbyś zrobić zagnieżdżone zestawy. Są trochę trudne do skonfigurowania, ale sprawiają, że zapytania są DUŻO prostsze. Tak więc, zamiast nadrzędnej kategorii, będziesz mieć dwie kolumny - lft
i rgt
. Lewa i prawa strona są w zasadzie granicami kategorii, jeśli identyfikator kategorii znajduje się między tymi wartościami, wiesz, że jest to element potomny tej kategorii.
+----+---------------+-----+------+
| 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 |
+----+---------------+-----+------+
Następnie, aby uzyskać liczbę pozycji w kategorii samochodów, możesz to zrobić w bardzo prosty sposób:
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'
Oczywiście możesz po prostu zmienić wartość category_name
i zdobądź przedmioty w DOWOLNEJ kategorii.
Przepraszamy, z jakiegoś powodu obraz obrócił się po przesłaniu go tutaj, ale jeśli narysujesz swoje kategorie jako koła, a następnie ponumerujesz linie, możesz zobaczyć, jaka powinna być wartość dla lewej i prawej strony.
Robiłem tylko samochody, ponieważ pomyślałem, że można ekstrapolować, aby uzyskać inne kategorie.
Więc jeśli piszesz swoje kategorie w ten sposób:
Cars(BMW(), Audi(100(),80(),A4(TDI(),Quatro(Black(2dr(),5dr()), White())))
Następnie możesz oznaczyć swój nawias liczbami:
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]
Lub jeśli narysujesz to jako drzewo, możesz oznaczyć je w ten sposób, gdzie oznaczysz lewy najbardziej lewy węzeł numerem, a prawy węzeł oznaczysz tylko wtedy, gdy oznaczysz wszystkie jego elementy podrzędne: