在MySQL中,处理层次结构数据(如树状或组织结构图)的查询

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	松江区	上海市 -> 上海市 -> 松江区
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值