数据库查询父分类与子分类

首先创建数据表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))






  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值