原表
有这样一张菜单表,菜单下可以有子菜单,需求:给你一个菜单ID,让你查出这个菜单下所有子菜单。
CREATE TABLE `t_menu` (
`menu_id` int unsigned NOT NULL AUTO_INCREMENT COMMENT '菜单ID',
`menu_name` varchar(128) NOT NULL COMMENT '菜单名称',
`menu_url` varchar(128) DEFAULT NULL COMMENT '菜单url',
`menu_level` int DEFAULT '-1' COMMENT '菜单级别',
`menu_type` int NOT NULL DEFAULT '0' COMMENT '菜单类型,0菜单,1按钮',
`menu_patent_id` int unsigned DEFAULT NULL COMMENT '父菜单ID',
`menu_icon` varchar(255) DEFAULT NULL COMMENT '资源图标',
`menu_order` int DEFAULT '0' COMMENT '资源顺序',
PRIMARY KEY (`menu_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
递归查询
MySQL8新增了 WITH RECURSIVE
递归查询父子集的方法,低于这个版本不生效.
-- 定义临时表 temp,缓存所有查询出来的结果
WITH recursive temp AS(
-- 根据菜单ID查询这条记录
SELECT * FROM t_menu WHERE menu_id=1
UNION ALL
-- 匹配父菜单ID和菜单ID相等的记录,并加入到 temp 表
SELECT m.* FROM t_menu m,temp t WHERE m.menu_patent_id=t.menu_id
)
-- 查询temp表中的记录
SELECT * FROM temp;