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;
结果: