मैं आपको बंद करने की तालिका के रूप में संग्रहीत पदानुक्रमित डेटा संरचना को सॉर्ट करने में समस्या के साथ मेरी सहायता करने के लिए कहूंगा।एक बंदरगाह तालिका में एक उपखंड को क्रमबद्ध करना पदानुक्रमित-डेटा संरचना
मैं अपनी वेबसाइट मेनू को स्टोर करने के लिए इस संरचना का उपयोग करना चाहता था। सबकुछ ठीक काम करता है, लेकिन समस्या यह है कि मुझे कस्टम ऑर्डर में सटीक उपट्री को सॉर्ट करने का तरीका नहीं पता है। फिलहाल पेड़ को क्रम में क्रमबद्ध किया गया है जिसमें आइटम डेटाबेस में जोड़े गए थे।
मेरी संरचना क्लोजर टेबल्स और कुछ अन्य पोस्ट के बारे में Bill Karwin's article पर आधारित है। साथ __ROOT_ =
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
डेमो उदाहरण के लिए:
--
-- 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);
यहाँ एक पेड़ के लिए अपने चयन करें क्वेरी है:
यहाँ कुछ डेमो डेटा के साथ अपने MySQL डेटाबेस संरचना है 1 वह क्वेरी प्राप्त होती है:
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
लेकिन अगर मुझे उदाहरण के लिए बिल्ली 1.1 और बिल्ली 1.2 (नाम के अनुसार, या कुछ कस्टम ऑर्डर) के क्रम को बदलने की आवश्यकता है तो क्या होगा?
मैंने कुछ ब्रेडक्रंब समाधान (ब्रेडक्रंब द्वारा क्रमबद्ध करने के लिए) देखा है, लेकिन मुझे नहीं पता कि उन्हें कैसे उत्पन्न और परिवर्तित करना है।
+1 नमूना डीडीएल और डेटा पोस्ट करने के लिए धन्यवाद। –