我正在使用以下SQL來生成分層數據並努力解決如何讓孩子按排序順序ID值進行排序。任何意見如何將不勝感激。請注意,這不是我的SQL,它來自我修改的OpenCart的類別列表頁面。我嘗試將排序順序添加到一些地方,但似乎沒有任何區別。我想輸出是表明是根據列值對分層SQL行進行排序
| PAGE_ID | NAME | PARENT_ID | SORT_ORDER |
|---------|----------------------------|-----------|------------|
| 75 | Index4 | 0 | -7 |
| 60 | Index | 0 | 0 |
| 68 | Index > Sub6 | 60 | -6 |
| 61 | Index > Sub1 | 60 | 1 |
| 65 | Index > Sub1 > SubSub2 | 61 | 4 |
| 64 | Index > Sub1 > SubSub1 | 61 | 6 |
| 67 | Index > Sub5 | 60 | 1 |
| 62 | Index > Sub2 | 60 | 2 |
| 63 | Index > Sub3 | 60 | 5 |
| 69 | Index > Sub3 > SubSub3 | 63 | 1 |
| 71 | Index > Sub3 > SubSub5 | 63 | 2 |
| 72 | Index > Sub3 > SubSub4 | 63 | 5 |
| 70 | Index > Sub3 > SubSub6 | 63 | 9 |
| 66 | Index > Sub4 | 60 | 7 |
| 74 | Index3 | 0 | 1 |
| 73 | Index2 | 0 | 4 |
注意,樹的每個子集是基於sort_order
列單獨訂購,所以對於Index
排序順序會對Sub1
,Sub2
或Sub3
並沒有影響無那些會對SubSub1
,SubSub2
或SubSub3
DROP TABLE IF EXISTS `oc_page`;
CREATE TABLE `oc_page` (
`page_id` int(11) NOT NULL AUTO_INCREMENT,
`parent_id` int(11) NOT NULL DEFAULT '0',
`sort_order` int(3) NOT NULL DEFAULT '0',
`status` tinyint(1) NOT NULL,
`date_added` datetime NOT NULL,
`date_modified` datetime NOT NULL,
PRIMARY KEY (`page_id`),
KEY `parent_id` (`parent_id`)
) ENGINE=MyISAM AUTO_INCREMENT=66 DEFAULT CHARSET=utf8;
BEGIN;
INSERT INTO `oc_page` VALUES ('60', '0', '0', '1', '2014-10-16 02:49:41', '2014-10-17 02:03:15'), ('61', '60', '1', '1', '2014-10-17 02:03:02', '2014-10-17 03:17:20'), ('62', '60', '2', '1', '2014-10-17 02:18:59', '2014-10-17 03:16:20'), ('63', '60', '3', '1', '2014-10-17 02:23:27', '2014-10-17 03:16:49'), ('64', '61', '6', '1', '2014-10-17 03:17:49', '2014-10-17 03:17:58'), ('65', '61', '4', '1', '2014-10-17 03:18:36', '2014-10-17 03:18:36');
COMMIT;
DROP TABLE IF EXISTS `oc_page_description`;
CREATE TABLE `oc_page_description` (
`page_id` int(11) NOT NULL,
`language_id` int(11) NOT NULL,
`name` varchar(255) NOT NULL,
`description` text NOT NULL,
`meta_title` varchar(255) NOT NULL,
`meta_description` varchar(255) NOT NULL,
`meta_keyword` varchar(255) NOT NULL,
PRIMARY KEY (`page_id`,`language_id`),
KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
BEGIN;
INSERT INTO `oc_page_description` VALUES ('60', '1', 'Index', '<p>Test</p>', 'Test', '', ''), ('61', '1', 'Sub1', 'Sub1', 'Sub1', '', ''), ('64', '1', 'SubSub1', 'SubSub1', 'SubSub1', '', ''), ('65', '1', 'SubSub2', 'SubSub2', 'SubSub2', '', ''), ('62', '1', 'Sub2', 'Sub2', 'Sub2', '', ''), ('63', '1', 'Sub3', 'Sub3', 'Sub3', '', '');
COMMIT;
DROP TABLE IF EXISTS `oc_page_path`;
CREATE TABLE `oc_page_path` (
`page_id` int(11) NOT NULL,
`path_id` int(11) NOT NULL,
`level` int(11) NOT NULL,
PRIMARY KEY (`page_id`,`path_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
BEGIN;
INSERT INTO `oc_page_path` VALUES ('60', '60', '0'), ('61', '61', '1'), ('61', '60', '0'), ('62', '62', '1'), ('62', '60', '0'), ('63', '63', '1'), ('63', '60', '0'), ('64', '64', '2'), ('64', '60', '0'), ('64', '61', '1'), ('65', '60', '0'), ('65', '61', '1'), ('65', '65', '2');
COMMIT;
DROP TABLE IF EXISTS `oc_page_to_store`;
CREATE TABLE `oc_page_to_store` (
`page_id` int(11) NOT NULL,
`store_id` int(11) NOT NULL,
PRIMARY KEY (`page_id`,`store_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
BEGIN;
INSERT INTO `oc_page_to_store` VALUES ('60', '0'), ('61', '0'), ('62', '0'), ('63', '0'), ('64', '0'), ('65', '0');
COMMIT;
的效果
查詢1:
SELECT pp.page_id AS page_id,
GROUP_CONCAT(pd1.name
ORDER BY pp.level SEPARATOR ' > ') AS name,
p1.parent_id,
p1.sort_order
FROM oc_page_path pp
LEFT JOIN oc_page p1 ON (pp.page_id = p1.page_id)
LEFT JOIN oc_page p2 ON (pp.path_id = p2.page_id)
LEFT JOIN oc_page_description pd1 ON (pp.path_id = pd1.page_id)
LEFT JOIN oc_page_description pd2 ON (pp.page_id = pd2.page_id)
WHERE pd1.language_id = '1'
AND pd2.language_id = '1'
GROUP BY pp.page_id
ORDER BY name ASC LIMIT 0,20
注:這是我加入到澄清問題更多虛擬數據。小提琴將顯示顯著較少的數據
| PAGE_ID | NAME | PARENT_ID | SORT_ORDER |
|---------|----------------------------|-----------|------------|
| 60 | Index | 0 | 0 |
| 61 | Index > Sub1 | 60 | 1 |
| 64 | Index > Sub1 > SubSub1 | 61 | 6 |
| 65 | Index > Sub1 > SubSub2 | 61 | 4 |
| 62 | Index > Sub2 | 60 | 2 |
| 63 | Index > Sub3 | 60 | 5 |
| 69 | Index > Sub3 > SubSub3 | 63 | 1 |
| 70 | Index > Sub3 > SubSub6 | 63 | 9 |
| 71 | Index > Sub3 > SubSub5 | 63 | 2 |
| 72 | Index > Sub3 > SubSub4 | 63 | 5 |
| 66 | Index > Sub4 | 60 | 7 |
| 67 | Index > Sub5 | 60 | 1 |
| 68 | Index > Sub6 | 60 | -6 |
| 73 | Index2 | 0 | 4 |
| 74 | Index3 | 0 | 1 |
| 75 | Index4 | 0 | -7 |
我有一個downvote沒有問題,但我希望人們至少會評論什麼需要改進之前 – 2014-10-17 15:00:05