MySql 利用函数 查询所有子节点

转载自:https://www.cnblogs.com/nww57/p/5359113.html

前提:mysql  函数  find_in_set(str,strlist), cast(value as type)

  一、find_in_set(str,strlist):如果字符串str是在的strlist组成的N子串的字符串列表,返回值的范围为1到N。

   如果str不在strliststrlist为空字符串,则返回值为 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))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值