Anda kemungkinan besar ingin melakukan set bersarang. Mereka sedikit sulit untuk diatur, tetapi membuat kueri JAUH lebih sederhana. Jadi, alih-alih induk kategori, Anda akan memiliki dua kolom - lft
dan rgt
. Kiri dan kanan pada dasarnya adalah batas kategori, jika id kategori item berada di antara nilai-nilai tersebut, Anda tahu bahwa itu adalah anak dari kategori tersebut.
+----+---------------+-----+------+
| 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 |
+----+---------------+-----+------+
Lalu, untuk mendapatkan jumlah item dalam kategori mobil, kamu bisa melakukannya dengan sangat sederhana seperti ini:
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'
Jelas Anda bisa mengubah nilai category_name
dan dapatkan item dalam kategori APAPUN.
Maaf, untuk beberapa alasan gambar berputar ketika saya mengunggahnya di sini, tetapi jika Anda menggambar kategori Anda sebagai lingkaran, dan kemudian memberi nomor pada garis, Anda dapat melihat berapa nilainya untuk kiri dan kanan.
Saya hanya mengerjakan mobil karena saya pikir Anda bisa memperkirakan untuk mendapatkan kategori lainnya.
Jadi jika Anda menulis kategori Anda seperti ini:
Cars(BMW(), Audi(100(),80(),A4(TDI(),Quatro(Black(2dr(),5dr()), White())))
Kemudian Anda dapat memberi label tanda kurung dengan angka:
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]
Atau jika Anda memetakannya sebagai pohon, Anda dapat memberi label seperti ini, di mana Anda memberi label pada simpul paling kiri dengan angka, dan hanya memberi label pada simpul kanan jika Anda telah memberi label pada semua turunannya: