1.mysql表结构如下
CREATE TABLE `division` (
`id` int NOT NULL AUTO_INCREMENT COMMENT 'id',
`parent_code` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '上级代码',
`code` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '代码',
`division_type` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '行政类型',
`name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '名称',
`status` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '状态',
`create_time` datetime NOT NULL COMMENT '录入时间',
PRIMARY KEY (`id`) USING BTREE,
KEY `UK_division_code` (`code`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=3220 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='行政区域';
2.sql如下
WITH RECURSIVE org_path AS (
-- 递归的起点:选择根组织(假设根组织的super_id为NULL或某个特定值)
SELECT code, name, CAST(name AS CHAR(255)) AS org_path
FROM division
WHERE parent_code='-1' -- 或者使用具体的根组织ID,如 super_id = 1
UNION ALL
SELECT o.code, o.name, CONCAT(p.org_path, ' -> ', o.name)
FROM division o
INNER JOIN org_path p ON o.parent_code = p.code
)
SELECT * FROM org_path
ORDER BY org_path;
3.效果就是省市区就会拼接起来,数据如下
code name org_path
310000 上海市 上海市
310100 上海市 上海市 -> 上海市
310114 嘉定区 上海市 -> 上海市 -> 嘉定区
310120 奉贤区 上海市 -> 上海市 -> 奉贤区
310113 宝山区 上海市 -> 上海市 -> 宝山区
310151 崇明区 上海市 -> 上海市 -> 崇明区
310104 徐汇区 上海市 -> 上海市 -> 徐汇区
310107 普陀区 上海市 -> 上海市 -> 普陀区
310110 杨浦区 上海市 -> 上海市 -> 杨浦区
310117 松江区 上海市 -> 上海市 -> 松江区