sql实现根据节点id查这个节点下的所有节点

CREATE TABLE k_menu (
id int NOT NULL AUTO_INCREMENT COMMENT ‘自增ID’,
menu_id varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT ‘目录ID’,
name varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT ‘目录名称’,
parent_id varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT ‘-1’ COMMENT ‘父目录ID’,
eid int DEFAULT NULL COMMENT ‘创建者id’,
team_id int DEFAULT ‘0’ COMMENT ‘所属团队ID(0:全所,any:团队)’,
type int DEFAULT ‘1’ COMMENT ‘种类(0:管理员菜单 , 1:文章菜单)’,
icon varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT ‘图标路径’,
path varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT ‘路由路径’,
state int DEFAULT ‘1’ COMMENT ‘状态(0:逻辑删除,1:全所,2:团队,3:个人,4:个人收藏)’,
gmt_create datetime DEFAULT CURRENT_TIMESTAMP COMMENT ‘创建时间’,
gmt_modified datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT ‘修改时间’,
manage_right varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT ‘管理权限’,
category_id varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
order_number decimal(30,5) DEFAULT ‘0.00000’ COMMENT ‘目录排序’,
PRIMARY KEY (id) USING BTREE,
UNIQUE KEY id_UNIQUE (id) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=4177 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC;
对于这种表结构,如何实现根据一个menu_id查这个menu_id下的所有子节点

要实现根据一个 menu_id 查找这个 menu_id 下的所有子节点,可以使用递归查询(CTE - Common Table Expressions)。以下是一个示例 SQL 查询,它会递归地查找给定 menu_id 的所有子节点:

sql

WITH RECURSIVE menu_hierarchy AS (
SELECT
id,
menu_id,
name,
parent_id,
eid,
team_id,
type,
icon,
path,
state,
gmt_create,
gmt_modified,
manage_right,
category_id,
order_number
FROM k_menu
WHERE menu_id = ‘your_menu_id’ – 替换为你要查找的 menu_id

UNION ALL

SELECT
km.id,
km.menu_id,
km.name,
km.parent_id,
km.eid,
km.team_id,
km.type,
km.icon,
km.path,
km.state,
km.gmt_create,
km.gmt_modified,
km.manage_right,
km.category_id,
km.order_number
FROM k_menu km
INNER JOIN menu_hierarchy mh ON km.parent_id = mh.menu_id
)

SELECT * FROM menu_hierarchy;
解释:
CTE 初始化部分:

sql

SELECT
id,
menu_id,
name,
parent_id,
eid,
team_id,
type,
icon,
path,
state,
gmt_create,
gmt_modified,
manage_right,
category_id,
order_number
FROM k_menu
WHERE menu_id = ‘your_menu_id’
这部分从表 k_menu 中选择给定 menu_id 的节点。

递归部分:

sql

SELECT
km.id,
km.menu_id,
km.name,
km.parent_id,
km.eid,
km.team_id,
km.type,
km.icon,
km.path,
km.state,
km.gmt_create,
km.gmt_modified,
km.manage_right,
km.category_id,
km.order_number
FROM k_menu km
INNER JOIN menu_hierarchy mh ON km.parent_id = mh.menu_id
这部分从表 k_menu 中选择所有父节点为当前节点的子节点,并递归连接,直到没有更多的子节点。

最终查询:

sql

SELECT * FROM menu_hierarchy;
这部分将返回所有在递归查询中找到的节点。

将 your_menu_id 替换为你需要查找的 menu_id,该查询将会返回该 menu_id 及其所有子节点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值