Tôi muốn yêu cầu bạn giúp tôi giải quyết vấn đề với việc sắp xếp cấu trúc dữ liệu phân cấp được lưu trữ dưới dạng bảng đóng cửa.Sắp xếp một cây con trong cấu trúc phân cấp dữ liệu theo thứ bậc
Tôi muốn sử dụng cấu trúc này để lưu trữ menu trang web của mình. Tất cả mọi thứ hoạt động tốt, nhưng vấn đề là tôi không biết làm thế nào để sắp xếp các subtree chính xác theo thứ tự tùy chỉnh. Tại thời điểm này cây được sắp xếp theo thứ tự các mục được thêm vào cơ sở dữ liệu.
Cấu trúc của tôi dựa trên Bill Karwin's article về Bảng đóng và một số bài đăng khác.
Dưới đây là cấu trúc cơ sở dữ liệu MySQL của tôi với một số dữ liệu DEMO:
--
-- Table `category`
--
CREATE TABLE IF NOT EXISTS `category` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) COLLATE utf8_czech_ci NOT NULL,
`active` tinyint(1) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
INSERT INTO `category` (`id`, `name`, `active`) VALUES
(1, 'Cat 1', 1),
(2, 'Cat 2', 1),
(3, 'Cat 1.1', 1),
(4, 'Cat 1.1.1', 1),
(5, 'Cat 2.1', 1),
(6, 'Cat 1.2', 1),
(7, 'Cat 1.1.2', 1);
--
-- Table `category_closure`
--
CREATE TABLE IF NOT EXISTS `category_closure` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`ancestor` int(11) DEFAULT NULL,
`descendant` int(11) DEFAULT NULL,
`depth` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fk_category_closure_ancestor_category_id` (`ancestor`),
KEY `fk_category_closure_descendant_category_id` (`descendant`)
) ENGINE=InnoDB;
INSERT INTO `category_closure` (`id`, `ancestor`, `descendant`, `depth`) VALUES
(1, 1, 1, 0),
(2, 2, 2, 0),
(3, 3, 3, 0),
(4, 1, 3, 1),
(5, 4, 4, 0),
(7, 3, 4, 1),
(8, 1, 4, 2),
(10, 6, 6, 0),
(11, 1, 6, 1),
(12, 7, 7, 0),
(13, 3, 7, 1),
(14, 1, 7, 2),
(16, 5, 5, 0),
(17, 2, 5, 1);
Đây là câu hỏi của tôi CHỌN cho một cây:
SELECT c2.*, cc2.ancestor AS `_parent`
FROM category AS c1
JOIN category_closure AS cc1 ON (cc1.ancestor = c1.id)
JOIN category AS c2 ON (cc1.descendant = c2.id)
LEFT OUTER JOIN category_closure AS cc2 ON (cc2.descendant = c2.id AND cc2.depth = 1)
WHERE c1.id = __ROOT__ AND c1.active = 1
ORDER BY cc1.depth
Đối với các trường hợp DEMO với __ROOT_ = 1 truy vấn đó nhận được:
id name active _parent
1 Cat 1 1 NULL
3 Cat 1.1 1 1
6 Cat 1.2 1 1
4 Cat 1.1.1 1 3
7 Cat 1.1.2 1 3
Nhưng nếu tôi ví dụ như cần thay đổi thứ tự của Cat 1.1 và Cat 1.2 (theo tên, hoặc một số thứ tự tùy chỉnh)?
Tôi đã thấy một số giải pháp đường dẫn (cách sắp xếp theo đường dẫn), nhưng tôi không biết cách tạo và thay đổi chúng.
+1 cảm ơn vì đã đăng DDL mẫu và dữ liệu. –