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的,宝宝们不要奇怪!
第四步:就是把不属于子节点的部分,全部去除掉。