MySql 利用函数 查询所有子节点
前提:mysql 函数 find_in_set(str,strlist), cast(value as type)
一、find_in_set(str,strlist):如果字符串str是在的strlist组成的N子串的字符串列表,返回值的范围为1到N。
如果str不在strlist或strlist为空字符串,则返回值为 0 。如任意一个参数为NULL,则返回值为 NULL。 这个函数在第一个参数包含一个逗号(',')时将无法正常运行。
①find_in_set(str,strlist)与in()的区别: 当find_in_set(str,strlist)中strlist的值是常数的时候,其效果就相当于in();
eg: select * from t_areainfo where FIND_IN_SET(name,'中国,华北区,华南区') == select * from t_areainfo where name in ('中国','华北区','华南区')
②find_ind_set(str,strlist)与like区别: like是广泛的模糊匹配,字符串中没有分隔符,Find_IN_SET 是精确匹配,字段值以英文”,”分隔,Find_IN_SET查询的结果要小于like查询的结果。
eg:
select * from t_areainfo t where t.`name` like '%XX区%'
select * from t_areainfo t where FIND_IN_SET('XX区',t.`name`) select * from t_areainfo t where FIND_IN_SET('北京XX区4',t.`name`)
二、cast(value as type):用户数据类型转换
eg:cast('1' as int) 将char类型的值'1',转换成 int型的 1;
言归正传:使用mysql 函数来查找 所有子节点
DROP FUNCTION IF EXISTS queryChildrenAreaInfo; CREATE FUNCTION `queryChildrenAreaInfo` (areaId INT) //创建一个函数 queryChildrenAreaInfo(areaId int) 参数为int型
RETURNS VARCHAR (4000) //定义返回值类型 varchar(4000) BEGIN //函数开始 DECLARE sTemp VARCHAR (4000); //定义一个varchar类型的参数 DECLARE sTempChd VARCHAR (4000); //定义一个varchar类型的参数 SET sTemp = '$'; //给sTmp赋值 SET sTempChd = cast(areaId AS CHAR); //将函数中的int型的参数转换成 char型 赋值给sTempChd
WHILE sTempChd IS NOT NULL DO //循环体 SET sTemp = CONCAT(sTemp, ',', sTempChd); //拼接sTemp SELECT group_concat(id) INTO sTempChd FROM t_areainfo WHERE FIND_IN_SET(parentId, sTempChd) > 0; //根据父节点,查询出该父节点下的所有子节点的id,支持多级查询 END WHILE; RETURN sTemp; END;
调用方式:
select * from t_areainfo t where FIND_IN_SET(id,queryChildrenAreaInfo(4))