1. 程式人生 > >資料庫查詢父分類與子分類

資料庫查詢父分類與子分類

首先建立資料表tmpCity,結構與資料如下(id標識,title名稱,parentID父級id,leaves幾級分類):


oracle 根據id,查詢其上下級的所有組織:

--查詢下級的所有區域
select * from tmpCity A where id<>1 start with A.id=1 connect by prior A.ID = A.Parentid
--查詢上級的所有區域
select * from tmpCity A start with A.id=13 connect by prior A.Parentid=A.Id;

sqlServer (2005以後)根據id,查詢其上下級的所有組織:

--查詢下級的所有區域
with cte_child(ID,ParentID,Title,levels)
as
(
    --起始條件
    select ID,ParentID,Title,levels from tmpCity where id = '1' --列出父節點查詢條件
    union all
    --遞迴條件
    select a.ID,a.ParentID,a.title,a.levels from tmpCity a
    inner join 
    cte_child b
    on ( a.ParentID=b.ID)  --根據查詢到的父節點(a.Parent),通過CTE遞迴查詢出其子節點(b.ID)
)
select * from cte_child;

--查詢樹狀結構某節點的上級所有根節點。
with cte_root(ID,ParentID,title,levels)
as
(
    --起始條件
    select ID,ParentID,title,levels from tmpCity where id = '13'   --列出子節點查詢條件
    union all
    --遞迴條件
    select a.ID,a.ParentID,a.title,a.levels from tmpCity a
    inner join 
    cte_root b          
    on a.ID=b.ParentID  --根據基礎表條件查詢子節點(a.ID),通過CTE遞迴找到其父節點(b.ParentID)。
)                       
select * from cte_root ;

MySql根據id,查詢其上下級的所有組織:

mysql沒有遞迴函式,需自己建立一個
CREATE FUNCTION getChildList(rootId INT) #rootId為你要查詢的節點。
 RETURNS VARCHAR(1000)  
 BEGIN 
	 DECLARE pTemp VARCHAR(1000);  
	 DECLARE cTemp VARCHAR(1000);  #兩個臨時變數
	
	 SET pTemp = '$';  
	 SET cTemp =cast(rootId as CHAR);  #把rootId強制轉換為字元。
	
	 WHILE cTemp is not null DO  
		 SET pTemp = concat(pTemp,',',cTemp);  #把所有節點連線成字串。
		 SELECT group_concat(id) INTO cTemp FROM tmpcity   
		 WHERE FIND_IN_SET(parentId,cTemp)>0;
	 END WHILE;  
	 RETURN pTemp; 
 END
select * from tmpcity where FIND_IN_SET(id,getChildList(1))