Mysql:通过一张表里的父子级,递归查询并且分组分级
递归函数WITH RECURSIVE语法
WITH RECURSIVE cte_name (column_list) AS (SELECT initial_query_resultUNION [ALL]SELECT recursive_queryFROM cte_nameWHERE condition
)
SELECT * FROM cte_name;
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查询 临时递归表 中的列名进行指定。
例子
表:gc_jzst_single_base
需求:要求返回这张表里符合条件的数据,且有父子级关系的,展示为同一组且分级,给后续业务调用
代码
WITH RECURSIVE t1 AS (SELECTsingle_id,old_build_single_id,single_name,bulid_code,1 AS LEVEL,single_id groupFlag FROMgc_jzst_single_base WHEREsingle_assort = '1' AND build_status != '0' AND single_type = 'DWGC_DTLX_0802' AND old_build_single_id IS NULL UNION ALLSELECTb.single_id,b.old_build_single_id,b.single_name,b.bulid_code,t1.LEVEL + 1,t1.groupFlag FROMgc_jzst_single_base bJOIN t1 WHEREb.old_build_single_id = t1.single_id AND b.single_assort = '1' AND b.build_status != '0' AND b.single_type = 'DWGC_DTLX_0802' AND b.old_build_single_id IS NOT NULL ) -- 终止条件部分
SELECT*
FROMt1
ORDER BYgroupFlag;
结果:满足条件