MySQL with Recursive的作用是基于一组初始数据,进行递归查询,返回符合条件的数据集。这种递归查询方式可以应用在很多场景下,比如对于树形结构、层级结构的数据处理,以及对数据进行分类汇总等。

MySQL with Recursive的使用限制?

MySQL with Recursive的使用限制主要在于查询语句的复杂性和效率。递归查询的复杂度随着层数的增加而增加,如果递归层数过多可能会导致查询效率低下甚至出现死循环的情况。因此,在使用MySQL with Recursive时需要注意数据量大小和递归层数。

语法:

WITH RECURSIVE cte_name (column_list) AS (
    SELECT initial_query_result
    UNION [ALL]
    SELECT recursive_query FROM cte_name
    WHERE condition
)
SELECT * FROM cte_name;

MySQL with Recursive语法详解

WITH RECURSIVE:表示要使用递归查询的方式处理数据。

cte_name:给这个临时的递归表取个名字,可以在初始查询和递归查询中引用。

column_list:表示cte_name查询表中包含的列名,列名之间用逗号分隔。

initial_query_result:表示初始的查询结果,应该与column_list中的列名对应。

UNION:表示将两个查询结果集进行联合,使用UNION ALL则表示保留重复数据。

recursive_query:表示递归查询语句,应当与column_list中的列名对应。

condition:表示递归查询的终止条件,需要使用cte_name中的列进行判断。

SELECT * FROM cte_name:表示最终返回的查询结果集,可以通过cte_name查询表中的列名进行指定。

使用:

查询父节点,含自己

1、表如下

2、sql如下:

WITH RECURSIVE recursion (id,  chi_short_name, pid, area_level) AS
(
  SELECT t1.id,  t1.chi_short_name,  t1.pid, t1.area_level
      from t_area_code t1
     where t1.id=110105
  UNION ALL
SELECT t2.id,t2.chi_short_name, t2.pid, t2.area_level
from t_area_code t2, recursion t3 WHERE t2.id=t3.pid
)
SELECT t.id,  t.chi_short_name, t.pid,t.area_level FROM recursion t;

注意:是t2.id=t3.pid,别弄反了

结果如下:

查询父节点,不含自己

WITH RECURSIVE recursion (id,  chi_short_name, pid, area_level) AS
(
  SELECT t1.id,  t1.chi_short_name,  t1.pid, t1.area_level
      from t_area_code t1
     where t1.id=110105
  UNION ALL
SELECT t2.id,t2.chi_short_name, t2.pid, t2.area_level
from t_area_code t2, recursion t3 WHERE t2.id=t3.pid
)
SELECT t.id,  t.chi_short_name, t.pid,t.area_level FROM recursion t where t.id!=110105;

结果:

查询子节点,含自己

WITH RECURSIVE recursion (id,  chi_short_name, pid, area_level) AS
(
  SELECT t1.id,  t1.chi_short_name,  t1.pid, t1.area_level
      from t_area_code t1
     where t1.id=110000
  UNION ALL
SELECT t2.id,t2.chi_short_name, t2.pid, t2.area_level
from t_area_code t2, recursion t3 WHERE t2.pid=t3.id
)
SELECT t.id,  t.chi_short_name, t.pid,t.area_level FROM recursion t 

结果如下:

 查询子节点,不含自己

WITH RECURSIVE recursion (id,  chi_short_name, pid, area_level) AS
(
  SELECT t1.id,  t1.chi_short_name,  t1.pid, t1.area_level
      from t_area_code t1
     where t1.id=110000
  UNION ALL
SELECT t2.id,t2.chi_short_name, t2.pid, t2.area_level
from t_area_code t2, recursion t3 WHERE t2.pid=t3.id
)
SELECT t.id,  t.chi_short_name, t.pid,t.area_level FROM recursion t where t.id!=110000;

结果:

 

posted on 2023-12-12 16:30  周文豪  阅读(269)  评论(0编辑  收藏  举报