MySQL树形递归查询是指在MySQL数据库中,通过递归查询的方式获取树形结构数据的方法。该方法可以用于实现维度表、组织架构表等具有树形结构的数据的查询。
以下是实现MySQL树形递归查询的具体步骤:
一、创建示例表
创建一张示例数据表,包含ID、名称、父ID等字段。例如:
CREATE TABLE `category` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '分类ID',
`name` varchar(100) NOT NULL COMMENT '分类名称',
`parent_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '父级ID',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
二、插入示例数据
插入一些测试数据,例如:
INSERT INTO `category`(`id`, `name`, `parent_id`) VALUES (1, '电子产品', 0);
INSERT INTO `category`(`id`, `name`, `parent_id`) VALUES (2, '电脑', 1);
INSERT INTO `category`(`id`, `name`, `parent_id`) VALUES (3, '笔记本电脑', 2);
INSERT INTO `category`(`id`, `name`, `parent_id`) VALUES (4, '台式电脑', 2);
INSERT INTO `category`(`id`, `name`, `parent_id`) VALUES (5, '手机', 1);
INSERT INTO `category`(`id`, `name`, `parent_id`) VALUES (6, '华为手机', 5);
INSERT INTO `category`(`id`, `name`, `parent_id`) VALUES (7, '小米手机', 5);
三、使用递归查询获取树形数据
首先,需要定义一个存储过程,用于实现递归查询。
示例代码:
-- 定义存储过程
DELIMITER $$
CREATE PROCEDURE `get_category_tree`(IN parentId INT)
BEGIN
-- 1. 查询当前级别的所有记录
SELECT
id,
name,
parent_id
FROM
`category`
WHERE
parent_id = parentId;
-- 2. 获取当前级别的所有子级记录
SET @childIds = (SELECT GROUP_CONCAT(id) FROM `category` WHERE parent_id = parentId);
-- 3. 判断是否存在下级记录,递归查询
IF (@childIds IS NOT NULL) THEN
SET @sql = CONCAT('CALL get_category_tree(', @childIds, ')');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END IF;
END$$
DELIMITER ;
该存储过程接收一个参数parentId,代表要查询的级别,函数根据传入的parentId查找出对应的所有记录,并获取每条记录的子级记录ID,然后再递归查询所有子级记录,直到不存在下级记录为止。
使用示例:
-- 调用存储过程,获取全部树形结构数据
CALL get_category_tree(0);
执行此查询可以获取全部树形结构数据:
id | name | parent_id |
---|---|---|
1 | 电子产品 | 0 |
2 | 电脑 | 1 |
5 | 手机 | 1 |
3 | 笔记本电脑 | 2 |
4 | 台式电脑 | 2 |
6 | 华为手机 | 5 |
7 | 小米手机 | 5 |
四、限制层级深度
如果不想获取全部层级的数据,可以在存储过程中添加一个参数用于限制层级深度,例如:
DELIMITER $$
CREATE PROCEDURE `get_category_tree`(IN parentId INT, IN MAX_LEVEL INT)
BEGIN
-- 1. 查询当前级别的所有记录
SELECT
id,
name,
parent_id
FROM
`category`
WHERE
parent_id = parentId;
-- 2. 获取当前级别的所有子级记录
SET @childIds = (SELECT GROUP_CONCAT(id) FROM `category` WHERE parent_id = parentId);
-- 3. 判断是否存在下级记录,并判断层级深度是否达到限制
IF (@childIds IS NOT NULL) AND (MAX_LEVEL > 1) THEN
SET @sql = CONCAT('CALL get_category_tree(', @childIds, ', ', MAX_LEVEL - 1, ')');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END IF;
END$$
DELIMITER ;
该存储过程接收两个参数:parentId和MAX_LEVEL,代表要查询的级别和限制的最大层级深度。如果当前层级深度已经达到了限制,则不再递归查询下级记录。
使用示例:
-- 调用存储过程,获取指定层级深度的树形结构数据
CALL get_category_tree(0, 2);
执行此查询可以获取最大层级深度为2的树形结构数据:
id | name | parent_id |
---|---|---|
1 | 电子产品 | 0 |
2 | 电脑 | 1 |
5 | 手机 | 1 |
3 | 笔记本电脑 | 2 |
4 | 台式电脑 | 2 |
以上就是MySQL树形递归查询的实现方法,通过存储过程的递归调用,能够很方便地获取树形结构的数据。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Mysql树形递归查询的实现方法 - Python技术站