Je zou waarschijnlijk geneste sets willen doen. Ze zijn een beetje lastig in te stellen, maar maken de vragen VEEL eenvoudiger. Dus, in plaats van categorie-ouder, krijg je twee kolommen - lft
en rgt
. Links en rechts zijn in feite de grenzen van een categorie, als de categorie-ID van een item tussen die waarden ligt, weet je dat het een onderliggend item van die categorie is.
+----+---------------+-----+------+
| 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 |
+----+---------------+-----+------+
Om vervolgens het aantal items in de categorie auto's te krijgen, kunt u het heel eenvoudig als volgt doen:
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'
Uiteraard kun je gewoon de waarde van category_name
veranderen en ontvang de items in ELKE categorie.
Sorry, om de een of andere reden draaide de afbeelding toen ik hem hier uploadde, maar als je je categorieën als cirkels tekent en vervolgens de lijnen nummert, kun je zien wat de waarde moet zijn voor links en rechts.
Ik deed alleen auto's omdat ik dacht dat je kon extrapoleren om de andere categorieën te krijgen.
Dus als je je categorieën als volgt opschrijft:
Cars(BMW(), Audi(100(),80(),A4(TDI(),Quatro(Black(2dr(),5dr()), White())))
Vervolgens kunt u uw haakjes labelen met cijfers:
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]
Of als je het als een boom in kaart brengt, kun je het als volgt labelen, waarbij je het meest linkse knooppunt labelt met een nummer, en alleen het rechterknooppunt labelt als je alle onderliggende knooppunten hebt gelabeld: