MySQL 通过自定义函数实现递归查询父级 ID 或者子级 ID 的过程分为以下几步:
- 创建一个表用于存储数据,表结构应当包含一个主键和一个指向自己的外键,例如:
CREATE TABLE `category` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`parent_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fk_category_category` (`parent_id`),
CONSTRAINT `fk_category_category` FOREIGN KEY (`parent_id`) REFERENCES `category` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
- 插入数据,为了验证递归查询的正确性,需要插入一些有层次结构 的数据,示例如下:
INSERT INTO `category` (`id`, `name`, `parent_id`) VALUES
(1, '分类1', NULL),
(2, '分类1-1', 1),
(3, '分类1-1-1', 2),
(4, '分类1-2', 1),
(5, '分类2', NULL),
(6, '分类2-1', 5),
(7, '分类3', NULL),
(8, '分类3-1', 7),
(9, '分类3-1-1', 8);
- 创建自定义函数,用于查询指定分类的所有子级分类 ID,例如:
DELIMITER $$
CREATE FUNCTION `get_children_ids` (category_id INT) RETURNS VARCHAR(5000)
BEGIN
DECLARE children VARCHAR(5000) DEFAULT '';
DECLARE temp VARCHAR(100) DEFAULT '';
SELECT GROUP_CONCAT(id) INTO temp FROM category WHERE parent_id = category_id;
WHILE (temp IS NOT NULL) DO
SET children = CONCAT(children, ',', temp);
SELECT GROUP_CONCAT(id) INTO temp FROM category WHERE FIND_IN_SET(parent_id, temp);
END WHILE;
SET children = CONCAT(SUBSTR(children, 2), ',', category_id);
RETURN children;
END$$
DELIMITER ;
以上自定义函数的实现方法为递归查询。首先,通过给定的分类ID查询所有直接子分类,在每一次查询过程中进行连接操作,直到查询不到子分类为止。
- 测试自定义函数,例如查询分类1的所有子级分类 ID:
SELECT get_children_ids(1);
输出结果为:
2,3,4,1
其中,每个分类ID之间用逗号分隔,最后一个分类ID需要手动去除。
- 创建自定义函数,用于查询指定分类的所有父级分类 ID,例如:
DELIMITER $$
CREATE FUNCTION `get_parent_ids` (category_id INT) RETURNS VARCHAR(5000)
BEGIN
DECLARE parents VARCHAR(5000) DEFAULT '';
DECLARE temp INT DEFAULT category_id;
WHILE (temp IS NOT NULL) DO
SET temp = (SELECT parent_id FROM category WHERE id = temp);
IF (temp IS NOT NULL) THEN
SET parents = CONCAT(',', parents, temp);
END IF;
END WHILE;
SET parents = CONCAT(SUBSTR(parents, 2), ',', category_id);
RETURN parents;
END$$
DELIMITER ;
以上自定义函数的实现方法为循环查询,通过反复查询当前分类的父级,直到找不到更上一级为止。
- 测试自定义函数,例如查询分类3-1-1的所有父级分类 ID:
SELECT get_parent_ids(9);
输出结果为:
8,7,1
其中,每个分类ID之间用逗号分隔,最后一个分类ID需要手动去除。
通过完成以上步骤,你就可以在 MySQL 中通过自定义函数实现递归查询父级 ID 或者子级 ID 了。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MySQL通过自定义函数实现递归查询父级ID或者子级ID - Python技术站