Най-вероятно бихте искали да правите вложени набори. Те са малко трудни за настройка, но правят заявките МНОГО по-лесни. Така че, вместо родител на категорията, ще имате две колони - lft
и rgt
. Лявото и дясното са основно границите на категория, ако идентификаторът на категория на елемент е между тези стойности, вие знаете, че това е дъщерно на тази категория.
+----+---------------+-----+------+
| 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 |
+----+---------------+-----+------+
След това, за да получите броя на артикулите в категорията автомобили, можете да го направите супер просто така:
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'
Очевидно можете просто да промените стойността на category_name
и вземете артикулите във ВСЯКА КАТЕГОРИЯ.
Съжалявам, по някаква причина изображението се завъртя, когато го качих тук, но ако начертаете категориите си като кръгове и след това номерирате редовете, можете да видите каква трябва да бъде стойността за ляво и дясно.
Правих само коли, тъй като реших, че можете да екстраполирате, за да получите другите категории.
Така че, ако напишете категориите си така:
Cars(BMW(), Audi(100(),80(),A4(TDI(),Quatro(Black(2dr(),5dr()), White())))
След това можете да маркирате скобите си с числа:
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]
Или ако го очертаете като дърво, можете да го обозначите по следния начин, където маркирате най-левия възел с число и маркирате десния възел само когато сте обозначили всички негови дъщерни: