Sie möchten höchstwahrscheinlich verschachtelte Sätze erstellen. Sie sind etwas schwierig einzurichten, machen aber die Abfragen VIEL einfacher. Anstelle der übergeordneten Kategorie haben Sie also zwei Spalten - lft
und rgt
. Links und rechts sind im Grunde die Grenzen einer Kategorie. Wenn die Kategorie-ID eines Elements zwischen diesen Werten liegt, wissen Sie, dass es sich um ein Kind dieser Kategorie handelt.
+----+---------------+-----+------+
| 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 |
+----+---------------+-----+------+
Um dann die Anzahl der Artikel in der Kategorie Autos zu ermitteln, geht das ganz einfach so:
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'
Natürlich können Sie einfach den Wert von category_name
ändern und holen Sie sich die Artikel in JEDER Kategorie.
Tut mir leid, aus irgendeinem Grund hat sich das Bild gedreht, als ich es hier hochgeladen habe, aber wenn du deine Kategorien als Kreise zeichnest und dann die Zeilen nummerierst, kannst du sehen, was der Wert für links und rechts sein sollte.
Ich habe nur Autos gemacht, weil ich dachte, man könnte extrapolieren, um die anderen Kategorien zu bekommen.
Wenn Sie also Ihre Kategorien so aufschreiben:
Cars(BMW(), Audi(100(),80(),A4(TDI(),Quatro(Black(2dr(),5dr()), White())))
Dann können Sie Ihre Klammern mit Zahlen beschriften:
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]
Oder wenn Sie es als Baum darstellen, können Sie es so beschriften, wobei Sie den Knoten ganz links mit einer Nummer beschriften und den rechten Knoten erst beschriften, wenn Sie alle seine Kinder beschriftet haben: