MySQL 递归查询实践总结
mysql复杂查询使用实例
by:授客 qq:1033553122
表结构设计
select id, `name`, parent_id from `tb_testcase_suite`
说明:
parent_id值关联表自身id列的值,如果其值为-1,则表示该记录不存在父级记录,否则表示该记录存在父级记录(假设parent_id值为5,则父级记录id为5),暂且把该记录自身称之为子记录,父级及父父级的记录称之为祖先记录,子级及子子级记录称之为后辈记录
查询需求
1) 根据指定记录的id,查询该记录关联的所有祖先记录,并按层级返回祖先记录name
2) 根据指定parent_id,查询其关联的的所有后辈记录id
查询实现
通过函数调用实现
1)根据指定记录的id,查询该记录关联的所有祖先记录,并按层级返回祖先记录name
# 向下递归
drop function if exists querychildrensuiteids;
delimiter ;;
create function querychildrensuiteids(suiteid int)
returns varchar(4000)
begin
declare childsuiteids varchar(4000);
declare parentsuiteids varchar(4000);
set childsuiteids='';
set parentsuiteids = cast(suiteid as char);
while parentsuiteids is not null do
set childsuiteids= concat(parentsuiteids, ',', childsuiteids);
select group_concat(id) into parentsuiteids from tb_testcase_suite where find_in_set(parent_id, parentsuiteids)>0;
end while;
return childsuiteids;
end
;;
delimiter ;
# 调用
select querychildrensuiteids(5);
2)根据指定parent_id,查询其关联的的所有后辈记录id
# 向上递归
drop function if exists querysuitepath;
delimiter ;;
create function querysuitepath(suiteid int)
returns varchar(21845)
begin
declare suitepath varchar(21845);
declare parentid int;
declare suitename varchar(4000);
set suitepath='';
set suitename = '';
set parentid = null;
select parent_id, `name` into parentid, suitename from tb_testcase_suite where id = suiteid;
while parentid <>0 do
set suitepath = concat(suitename, '/', suitepath);
# 以下两行代码很关键 # 查询结果为空时,不会执行select ...into...这个赋值操作,导致parentid一直取最后一次查到的非0值,进而导致死循环
set suiteid = parentid;
set parentid = 0;
select parent_id, `name` into parentid, suitename from tb_testcase_suite where id = suiteid;
end while;
return concat('/', suitepath);
end
;;
delimiter ;
# 调用
select querysuitepath(5);
select id, querysuitepath(id), `name`, parent_id from `tb_testcase_suite`
上一篇: 零基础想学习web前端?这套教程是你正在苦苦寻找的吧
下一篇: Vue 向组件中插入内容