MySQL 菜单表sys_menu 查询父子关系SQL

文章讲述了如何使用MySQL的WITHRECURSIVE语句来查询菜单表(sys_menu)中的父子关系,包括如何从特定父级菜单(id=1或2540)开始获取所有子级菜单的数据。递归查询用于构建树形结构,但可能影响性能,因此需要注意表设计和索引优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MySQL 菜单表sys_menu 查询父子关系SQL

查询父级下所有子集菜单数据

作者需要同步一次菜单数据 从测试环境到生产环境,需要导出所有大的父级菜单下的所有子级菜单数据。

MySQL 可以使用 WITH RECURSIVE 结合递归查询,实现多层级的父子关系数据查询。

以下是一个示例 SQL 语句:

WITH RECURSIVE cte (id, name, parent_id, level) AS (
   SELECT id, name, parent_id, 0 FROM table_name WHERE id = 1
   UNION ALL
   SELECT t.id, t.name, t.parent_id, c.level + 1
   FROM table_name t
   INNER JOIN cte c ON t.id = c.parent_id
)
SELECT * FROM cte;
-- 查询菜单父子关系数据
WITH RECURSIVE cte (menu_id, menu_name, parent_id, level) AS (
   SELECT menu_id, menu_name, parent_id, 0 FROM sys_menu WHERE menu_id = 2540
   UNION ALL
   SELECT t.menu_id, t.menu_name, t.parent_id, c.level + 1
   FROM sys_menu t
   INNER JOIN cte c ON t.parent_id = c.menu_id
)
select * from sys_menu where menu_id in (SELECT menu_id FROM cte ORDER BY menu_id desc);

id = 1是我想要查询子级的父级菜单id

该语句将返回一个包含树形结构数据的结果集,每条记录都包含当前节点的 id、name、parent_id(父节点的 id)和 level(当前节点在树形结构中的层级)。

其中,table_name 是包含要查询数据的表名。在第一条 SELECT 语句中,我们选择指定的根节点(WHERE id = 1),并将其作为递归查询的起点。在第二条 SELECT 语句中,我们使用 INNER JOIN 连接递归查询结果集和原始表,以获取当前节点的所有子节点,并计算出它们的层级。

需要注意的是,递归查询可能会引起 MySQL 的性能问题,尤其是在大型数据集上。因此,在使用递归查询时,需要谨慎设计表结构和索引,并测试性能。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值