Những gì tôi đã làm trong các dự án trước đây mà tôi cần làm điều tương tự, tôi đã thêm hai cột mới.
- i_depth:giá trị int về độ sâu của danh mục
- nvc_breadcrumb:đường dẫn đầy đủ của danh mục ở loại định dạng breadcrumb
Và sau đó, tôi đã thêm một trình kích hoạt vào bảng chứa thông tin danh mục để thực hiện việc sau (cả ba bản cập nhật đều nằm trong cùng một trình kích hoạt) ...
-- 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
Và sau đó, chỉ cần tham gia với bảng sản phẩm của bạn trên ID danh mục và thực hiện "LIKE '% / [CATEGORYID] /%'". Hãy nhớ rằng điều này đã được thực hiện trong MS SQL, nhưng nó phải đủ dễ dàng để dịch sang phiên bản MySQL.
Nó có thể đủ tương thích để cắt và dán (sau khi thay đổi tên bảng và cột).
Mở rộng giải thích ...
t_categories (như bây giờ) ...
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 (sau khi sửa đổi) ...
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 (sau khi sử dụng tập lệnh tôi đã đưa)
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 (như bạn có bây giờ, không có sửa đổi) ...
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
Tham gia các danh mục và sản phẩm (trong đó danh mục là C, sản phẩm là 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
Bây giờ, giả sử rằng bảng sản phẩm đã hoàn thiện hơn để có những thứ trong mỗi danh mục và không có NULL, bạn có thể thực hiện "Breadcrumb LIKE '% / 5 /%'" để nhận ba mục cuối cùng của bảng cuối cùng mà tôi đã cung cấp. Lưu ý rằng nó bao gồm các mục trực tiếp và con của danh mục (như TV Samsung). Nếu bạn CHỈ muốn các mục danh mục cụ thể, chỉ cần thực hiện "c.cat =5".