Apa yang telah saya lakukan di proyek sebelumnya di mana saya perlu melakukan hal yang sama, saya menambahkan dua kolom baru.
- i_depth:nilai int seberapa dalam kategorinya
- nvc_breadcrumb:jalur lengkap kategori dalam format jenis remah roti
Lalu saya menambahkan pemicu ke tabel yang menampung informasi kategori untuk melakukan hal berikut (ketiga pembaruan berada di pemicu yang sama)...
-- Reset all branches
UPDATE t_org_branches
SET nvc_breadcrumb = NULL,
i_depth = NULL
-- Update the root branches first
UPDATE t_org_branches
SET nvc_breadcrumb = '/',
i_depth = 0
WHERE guid_branch_parent_id IS NULL
-- Update the child branches on a loop
WHILE EXISTS (SELECT * FROM t_branches WHERE i_depth IS NULL)
UPDATE tobA
SET tobA.i_depth = tobB.i_depth + 1,
tobA.nvc_breadcrumb = tobB.nvc_breadcrumb + Ltrim(tobA.guid_branch_parent_id) + '/'
FROM t_org_branches AS tobA
INNER JOIN t_org_branches AS tobB ON (tobA.guid_branch_parent_id = tobB.guid_branch_id)
WHERE tobB.i_depth >= 0
AND tobB.nvc_breadcrumb IS NOT NULL
AND tobA.i_depth IS NULL
Dan kemudian lakukan join dengan tabel produk Anda pada ID kategori dan lakukan "LIKE '%/[CATEGORYID]/%'". Ingatlah bahwa ini dilakukan dalam MS SQL, tetapi harus cukup mudah untuk diterjemahkan ke dalam versi MySQL.
Mungkin cukup kompatibel untuk cut and paste (setelah perubahan nama tabel dan kolom).
Perluasan penjelasan...
t_categories (seperti yang ada sekarang)...
Cat Parent CategoryName
1 NULL MyStore
2 1 Electronics
3 1 Clothing
4 1 Books
5 2 Televisions
6 2 Stereos
7 5 Plasma
8 5 LCD
t_categories (setelah dimodifikasi)...
Cat Parent CategoryName Depth Breadcrumb
1 NULL MyStore NULL NULL
2 1 Electronics NULL NULL
3 1 Clothing NULL NULL
4 1 Books NULL NULL
5 2 Televisions NULL NULL
6 2 Stereos NULL NULL
7 5 Plasma NULL NULL
8 5 LCD NULL NULL
t_categories (setelah menggunakan skrip yang saya berikan)
Cat Parent CategoryName Depth Breadcrumb
1 NULL MyStore 0 /
2 1 Electronics 1 /1/
3 1 Clothing 1 /1/
4 1 Books 1 /1/
5 2 Televisions 2 /1/2/
6 2 Stereos 2 /1/2/
7 5 LCD 3 /1/2/5/
8 7 Samsung 4 /1/2/5/7/
t_products (seperti yang Anda miliki sekarang, tidak ada modifikasi)...
ID Cat Name
1 8 Samsung LNT5271F
2 7 LCD TV mount, up to 36"
3 7 LCD TV mount, up to 52"
4 5 HDMI Cable, 6ft
Bergabunglah dengan kategori dan produk (di mana kategori adalah C, produk adalah P)
C.Cat Parent CategoryName Depth Breadcrumb ID p.Cat Name
1 NULL MyStore 0 / NULL NULL NULL
2 1 Electronics 1 /1/ NULL NULL NULL
3 1 Clothing 1 /1/ NULL NULL NULL
4 1 Books 1 /1/ NULL NULL NULL
5 2 Televisions 2 /1/2/ 4 5 HDMI Cable, 6ft
6 2 Stereos 2 /1/2/ NULL NULL NULL
7 5 LCD 3 /1/2/5/ 2 7 LCD TV mount, up to 36"
7 5 LCD 3 /1/2/5/ 3 7 LCD TV mount, up to 52"
8 7 Samsung 4 /1/2/5/7/ 1 8 Samsung LNT5271F
Sekarang dengan asumsi bahwa tabel produk lebih lengkap sehingga ada barang di setiap kategori dan tidak ada NULL, Anda bisa melakukan "Breadcrumb LIKE '%/5/%'" untuk mendapatkan tiga item terakhir dari tabel terakhir yang saya berikan. Perhatikan bahwa itu termasuk item langsung dan anak-anak dari kategori (seperti tv Samsung). Jika Anda ingin HANYA item kategori tertentu, lakukan saja "c.cat =5".