mysql中不用存储过程和函数查询某个节点下的所有子节点

3 篇文章 0 订阅
2 篇文章 0 订阅

select kpi_id,KPI_NAME,par_kpi_id from (
              select t1.kpi_id,t1.KPI_NAME,t1.par_kpi_id,
              if(find_in_set(par_kpi_id, @pids) > 0, @pids := concat(@pids, ',',kpi_id), 0) as ischild
              from (
                   select kpi_id,par_kpi_id ,KPI_NAME from GWN_GRADEKPI_KPI_DEF t  order by par_kpi_id, kpi_id    
                  ) t1,
                  (select @pids := -2) t2
             ) t3 where ischild != 0 

 

第一步:从from中查询你表中查询出需要的数据

第二步:if 里面等于三目运算   find_in_set(par_kpi_id, @pids) > 0, @pids := concat(@pids, ',',kpi_id), 0 

              如果:@pids里面的值包含 par_kpi_id的值,就将以逗号分隔符的形式进行连接@pids := concat(@pids, ',',kpi_id)

             否则:就为0

第三步: (select @pids := -2) t2   @pids 里面存储的是当前的父节点,是你需要树的根节点,才能一步步往下遍历

               还有就是 @pids 它是一个全局变量,第一次查询过后,它会保留值,所以第二次查询出

              select t1.kpi_id,t1.KPI_NAME,t1.par_kpi_id,
              if(find_in_set(par_kpi_id, @pids) > 0, @pids := concat(@pids, ',',kpi_id), 0) as ischild
              from (
                   select kpi_id,par_kpi_id ,KPI_NAME from GWN_GRADEKPI_KPI_DEF t  order by par_kpi_id, kpi_id    
                  ) t1

居然 ischild不是全部为0的,宝宝们不要奇怪!

第四步:就是把不属于子节点的部分,全部去除掉。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值