mysql中不用存儲過程和函數查詢某個節點下的所有子節點

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的,寶寶們不要奇怪!

第四步:就是把不屬於子節點的部分,全部去除掉。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章