Mysql递归查询实践

表格数据结构ding_dept


function

DROP FUNCTION IF EXISTS `getChildDepts`$$

CREATE DEFINER=`root`@`localhost` FUNCTION `getChildDepts`(rootId INT) RETURNS VARCHAR(1000) CHARSET utf8
BEGIN
	DECLARE sTemp VARCHAR(1000);
	DECLARE	sTempChd VARCHAR(1000);
	
	SET sTemp = '';
	SET sTempChd = CAST(rootId AS CHAR);
	
	WHILE sTempChd IS NOT NULL DO
		IF sTemp='' THEN
			SET sTemp = STempChd;
		ELSE
			SET sTemp = CONCAT(sTemp, ',',STempChd);
		END IF;
		SELECT GROUP_CONCAT(id) INTO sTempChd FROM ding_dept WHERE FIND_IN_SET(parentid,sTempChd)>0;
	END WHILE;
	RETURN sTemp;
    END$$

DELIMITER ;


---------------------------------------以下为参考文章

mysql递归查询,查父集合,查子集合

建函数

一、查父集合

Sql代码   收藏代码
  1. --drop FUNCTION `getParentList`  
  2. CREATE FUNCTION `getParentList`(rootId varchar(100))   
  3. RETURNS varchar(1000)   
  4. BEGIN   
  5. DECLARE fid varchar(100) default '';   
  6. DECLARE str varchar(1000) default rootId;   
  7.   
  8. WHILE rootId is not null  do   
  9.     SET fid =(SELECT parentid FROM treeNodes WHERE id = rootId);   
  10.     IF fid is not null THEN   
  11.         SET str = concat(str, ',', fid);   
  12.         SET rootId = fid;   
  13.     ELSE   
  14.         SET rootId = fid;   
  15.     END IF;   
  16. END WHILE;   
  17. return str;  
  18. END  

 查询:

Sql代码   收藏代码
  1. select getParentList('001001001001001');   
  2.   
  3. select * from sbkfwh where FIND_IN_SET(id,getParentList('001001001001002'))   

 

二、查子集合 

Java代码   收藏代码
  1. --drop FUNCTION `getChildList`  
  2. CREATE FUNCTION `getChildList`(rootId varchar(100))   
  3. RETURNS varchar(2000)  
  4. BEGIN   
  5. DECLARE str varchar(2000);  
  6. DECLARE cid varchar(100);   
  7. SET str = '$';   
  8. SET cid = rootId;   
  9. WHILE cid is not null DO   
  10.     SET str = concat(str, ',', cid);   
  11.     SELECT group_concat(id) INTO cid FROM treeNodes where FIND_IN_SET(parentid, cid) > 0;   
  12. END WHILE;   
  13. RETURN str;   
  14. END  

 

查询

Sql代码   收藏代码
  1. select getParentList('001001001');   
  2. select * from sbkfwh where FIND_IN_SET(id,getChildList('001001001'))  

 

Mysql函数中并不支持动态sql,Dynamic SQL is not allowed in stored function or trigger

要想查多个表的,可以建多个函数,或用以下方法

Sql代码   收藏代码
  1. drop FUNCTION `getChildListTest`     
  2. CREATE FUNCTION `getChildListTest`(tableName varchar(64),rootId varchar(100))      
  3. RETURNS varchar(2000)     
  4. BEGIN      
  5. DECLARE str varchar(2000);     
  6. DECLARE cid varchar(100);      
  7. SET str = '$';      
  8. SET cid = rootId;      
  9.   
  10. IF tableName = 'tableName1' THEN    
  11.         WHILE cid is not null DO      
  12.                 SET str = concat(str, ',', cid);      
  13.                 SELECT group_concat(id) INTO cid FROM tableName1 where FIND_IN_SET(parentid, cid) > 0;     
  14.         END WHILE;    
  15. ELSEIF tableName = 'tableName2' THEN    
  16.         WHILE cid is not null DO      
  17.                 SET str = concat(str, ',', cid);      
  18.                 SELECT group_concat(id) INTO cid FROM tableName2 where FIND_IN_SET(parentid, cid) > 0;     
  19.         END WHILE;    
  20. END IF;    
  21.   
  22. RETURN str;      
  23. END  

 

参考:

mysql 递归查询 (函数)

http://my.oschina.net/cheeryzxh007/blog/299475 (ID为INT型)

比较两种mysql递归tree查询效率-mysql递归tree  (函数,存储过程)

http://jingyan.baidu.com/article/647f01158ee0da7f2148a80b.html

MySQL中进行树状所有子节点的查询  (函数,存储过程)

http://blog.csdn.net/ACMAIN_CHM/article/details/4142971




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值