mysql8.0
准備表結構
CREATE TABLE `function` ( `Id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'Id', `CreateTime` datetime(0) NOT NULL COMMENT '創建時間', `ModifyTime` timestamp(0) NOT NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '修改時間', `Name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '名稱', `ParentId` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '上級功能Id', `Icon` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '圖標', `Type` int(11) NOT NULL COMMENT '功能類型', `Sort` int(11) NOT NULL COMMENT '類型', `Path` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '路徑', `Describe` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '描述', `Flag` bigint(20) NOT NULL COMMENT '標記', `Classify` int(10) NOT NULL COMMENT '所屬系統分類', PRIMARY KEY (`Id`) USING BTREE, UNIQUE INDEX `Index_Function_PathClassify`(`Path`, `Classify`) USING BTREE COMMENT '每個系統路徑是唯一的' ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Dynamic;
准備數據
INSERT INTO `function` VALUES ('1', '2019-07-08 16:03:29', '2019-07-08 16:03:31', '人力', '0', '/', 1, 1, '/a', '1', 0, 0); INSERT INTO `function` VALUES ('10', '2019-07-08 16:22:54', '2019-07-08 16:22:55', '企業資源', '3', '/qi', 1, 1, '/qi', NULL, 0, 0); INSERT INTO `function` VALUES ('2', '2019-07-08 16:06:55', '2019-07-08 16:06:57', '員工', '1', '/', 1, 1, '/c', '1', 0, 0); INSERT INTO `function` VALUES ('3', '2019-07-08 16:07:48', '2019-07-08 16:07:50', '組織', '1', '/', 1, 1, '/d', '1', 0, 0); INSERT INTO `function` VALUES ('4', '2019-07-08 16:08:28', '2019-07-08 16:08:31', '考勤', '1', '?', 1, 1, '/dsa', '1', 0, 0); INSERT INTO `function` VALUES ('5', '2019-07-08 16:08:53', '2019-07-08 16:09:27', '設備', '4', '/ss', 1, 1, '/3', '1', 0, 0); INSERT INTO `function` VALUES ('6', '2019-07-08 16:18:04', '2019-07-08 16:18:06', '打野', NULL, '/da', 1, 12, '/daa', NULL, 0, 1); INSERT INTO `function` VALUES ('7', '2019-07-08 16:19:52', '2019-07-08 16:19:55', '員工成員', '2', '/a', 1, 14, '/aa', '1', 0, 0); INSERT INTO `function` VALUES ('8', '2019-07-08 16:21:29', '2019-07-08 16:21:32', '員工家庭', '2', '/j', 1, 2, '/jt', '', 0, 0); INSERT INTO `function` VALUES ('9', '2019-07-08 16:22:18', '2019-07-08 16:22:20', '員工微信部落', '2', '/wx', 1, 1, '/wx', NULL, 0, 0);
全表數據展示
根據父級Id遞歸查詢所有子節點(查詢父級Id為0 並且分類為0的所有子節點)
WITH RECURSIVE _children AS ( SELECT fun.* FROM `function` fun WHERE fun.ParentId='0' AND Classify = 0 UNION ALL SELECT fun.* FROM _children,`function` fun WHERE fun.ParentId=_children.Id ) SELECT * FROM _children;
根據子節點查詢所有父親節點(查詢子節點Id為9的所有父節點)
WITH RECURSIVE _parent AS ( SELECT fun.* FROM `function` fun WHEREfun.Id='9' UNION ALL SELECT fun.* FROM _parent,`function` fun WHERE fun.Id=_parent.ParentId ) SELECT * FROM _parent;
mysql5.0參考: https://www.cnblogs.com/xiaoxi/p/5942805.html
sqlserver 在mysql8.0基礎上去掉RECURSIVE關鍵字即可
WITH _children AS ( SELECT fun.* FROM `function` fun WHERE fun.ParentId='0' AND Classify = 0 UNION ALL SELECT fun.* FROM _children,`function` fun WHERE fun.ParentId=_children.Id ) SELECT * FROM _children; WITH _parent AS ( SELECT fun.* FROM `function` fun WHERE fun.Id='9' UNION ALL SELECT fun.* FROM _parent,`function` fun WHERE fun.Id=_parent.ParentId ) SELECT * FROM _parent;