在oracle中 有非常方便的方法 start with… connect by prior … 示例:
select*from t_order o where o.company_id in(select c.company_id from t_company c
startwith c.company_id ='a'connectby prior c.company_id = c.company_parent_id)
SELECT id,T2.MENU_ID, T2.MENU_PID
FROM(SELECT@menuIdAS id,(SELECT@menuId := MENU_PID FROM s_menu WHERE MENU_ID = id)AS p_id,@mark :=@mark+1AS mark
FROM(SELECT@menuId :='500202',@mark :=0) t ,
s_menu h
WHERE@menuId<>0) T1
JOIN s_menu T2
ON T1.id = T2.MENU_ID
ORDERBY mark desc;
向下递归
其中union 下面是包含本身
# 向下递归select MENU_NAME,MENU_DESC,MENU_PATH,MENU_ORDER, MENU_ID,MENU_PID,PERMISSION from(select t1.MENU_NAME,t1.MENU_DESC,t1.MENU_PATH,t1.MENU_ORDER, t1.MENU_ID,t1.MENU_PID,t1.PERMISSION ,if(find_in_set(MENU_PID,@pids)>0,@pids := concat(@pids,',', MENU_ID),0)as ischild
from(select S.MENU_NAME,S.MENU_DESC,S.MENU_PATH,S.MENU_ORDER, S.MENU_ID,S.MENU_PID,S.PERMISSION from s_menu S
where S.IS_VALID =1) t1,(select@pids :='500200') t2
) t3 where ischild !=0unionselect S.MENU_NAME,S.MENU_DESC,S.MENU_PATH,S.MENU_ORDER, S.MENU_ID,S.MENU_PID,S.PERMISSION from r_role_menu RM rightjoin s_menu S on RM.MENU_ID = S.MENU_ID where S.IS_VALID =1and S.MENU_ID ='500200';