Mysql递归查询

发布时间:2023年12月28日

在MySQL中,实现递归查询可以使用递归CTE(Common Table Expression)或存储过程。下面分别介绍两种方法的实现。

  1. 递归CTE方法: 递归CTE是MySQL 8.0版本引入的功能。通过使用WITH RECURSIVE关键字,可以在查询语句中定义递归查询。

示例代码:

WITH RECURSIVE cte (id, name, parent_id, level) AS (
  SELECT id, name, parent_id, 0 FROM your_table WHERE id = 'root' -- 初始条件
  UNION ALL
  SELECT t.id, t.name, t.parent_id, cte.level + 1
  FROM your_table t
  INNER JOIN cte ON t.parent_id = cte.id
)
SELECT * FROM cte;

在上面的代码中,cte是递归CTE的名称,定义了id、name、parent_id和level列。初始条件是id为'root'的记录。递归部分通过连接cte和your_table表进行,直到满足终止条件。

  1. 存储过程方法: 存储过程是在数据库中定义的一组SQL语句的集合。通过使用存储过程可以实现递归查询。

示例代码:

DELIMITER $$ -- 修改语句分隔符

CREATE PROCEDURE recursive_query(IN p_id VARCHAR(255)) -- 输入参数为起始id
BEGIN
  DECLARE done INT DEFAULT FALSE;
  DECLARE current_id VARCHAR(255);
  CREATE TEMPORARY TABLE temp_table (id VARCHAR(255), name VARCHAR(255), parent_id VARCHAR(255), level INT);
  
  INSERT INTO temp_table SELECT id, name, parent_id, 0 FROM your_table WHERE id = p_id; -- 初始条件
  
  REPEAT
    SET done = TRUE;
    SELECT id, parent_id INTO current_id, p_id FROM temp_table WHERE level = (SELECT MAX(level) FROM temp_table);
    INSERT INTO temp_table SELECT id, name, parent_id, (SELECT MAX(level) FROM temp_table) + 1 FROM your_table WHERE parent_id = current_id;
    UNTIL ROW_COUNT() = 0
    END REPEAT;
  
  SELECT * FROM temp_table;
  DROP TEMPORARY TABLE temp_table;
END $$ -- 存储过程结束

DELIMITER ; -- 恢复语句分隔符

在上面的代码中,首先创建了一个存储过程recursive_query,接受一个输入参数p_id作为起始id。然后创建了一个临时表temp_table,用于存储递归的结果。在存储过程中使用了REPEAT-UNTIL循环来进行递归查询,直到没有新的记录插入为止。

以上是在MySQL中实现递归查询的两种方法。根据实际需求选择适合的方法来完成递归查询。

文章来源:https://blog.csdn.net/qq_62357662/article/details/135266260
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。