mysql低于8版本如何 递归查询
时间: 2023-12-28 07:04:36 浏览: 127
在 MySQL 8 之前的版本中,可以使用存储过程来实现递归查询。下面是一个简单的示例:
假设我们有一个表 `category` 存储了商品分类的树形结构,表结构如下:
```sql
CREATE TABLE `category` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`parent_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
```
其中,`parent_id` 表示父分类的 ID,根节点的 `parent_id` 为 NULL。
现在我们需要查询某个分类的所有子分类,包括子分类的子分类,以此类推。可以使用以下存储过程来实现递归查询:
```sql
DELIMITER //
CREATE PROCEDURE `get_children`(IN parent_id INT)
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE cur_id, cur_parent_id INT;
DECLARE cur_name VARCHAR(50);
DECLARE children_cursor CURSOR FOR
SELECT id, name, parent_id FROM category WHERE parent_id = parent_id;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
CREATE TEMPORARY TABLE temp_children (
id INT NOT NULL,
name VARCHAR(50) NOT NULL,
parent_id INT DEFAULT NULL,
PRIMARY KEY (id)
);
INSERT INTO temp_children
SELECT id, name, parent_id FROM category WHERE id = parent_id;
OPEN children_cursor;
children_loop: LOOP
FETCH children_cursor INTO cur_id, cur_name, cur_parent_id;
IF done THEN
LEAVE children_loop;
END IF;
INSERT INTO temp_children (id, name, parent_id)
SELECT id, name, parent_id FROM get_children(cur_id);
END LOOP;
CLOSE children_cursor;
SELECT * FROM temp_children;
DROP TABLE temp_children;
END //
DELIMITER ;
```
上述存储过程中,我们首先创建了一个临时表 `temp_children`,用于存储递归查询的结果。然后定义一个名为 `get_children` 的存储过程,以参数 `parent_id` 作为起始分类的 ID。在存储过程中,我们使用了一个游标 `children_cursor`,查询所有父分类为 `parent_id` 的子分类,并逐个处理每个子分类。如果子分类还有子分类,则递归调用 `get_children` 存储过程。最后,输出临时表 `temp_children` 中的所有记录,并删除临时表。
可以通过以下语句调用存储过程,并指定起始分类的 ID:
```sql
CALL get_children(1); -- 假设要查询分类 ID 为 1 的所有子分类
```
上述语句将输出所有子分类的 ID、名称和父分类的 ID。
阅读全文