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 的性能问题,尤其是在大型数据集上。因此,在使用递归查询时,需要谨慎设计表结构和索引,并测试性能。