MySQL实现类似Oracle中start with功能

什么是父   根就是父   获取父节点就是获取根 肯定得到的值越来越小

  1.  SELECT BMBH,CC,SSBMBH FROM ZC_BM
              START WITH BMBH=p_bmbh
              CONNECT BY PRIOR SSBMBH=BMBH
 
这个函数是从下往上(根)的,  所以是获取父节点  查出来的都比传入进去的小  也就是调用  getParentList
  1. -- 获取父节点树:  
  2. DROP FUNCTION IF EXISTS `getParentList`;  
  3. DELIMITER $$  
  4.   
  5. CREATE FUNCTION `getParentList`(rootId VARCHAR(10000)) RETURNS VARCHAR(10000) CHARSET utf8  
  6.     BEGIN   
  7.         DECLARE sParentList VARCHAR(10000);   
  8.         DECLARE sParentTemp VARCHAR(10000);   
  9.           
  10.         SET sParentTemp =rootId;   
  11.           
  12.         WHILE sParentTemp IS NOT NULL DO   
  13.             IF (sParentList IS NOT NULLTHEN   
  14.                 SET sParentList = CONCAT(sParentTemp,',',sParentList);   
  15.             ELSE   
  16.                 SET sParentList = CONCAT(sParentTemp);   
  17.             END IF;   
  18.               
  19.             SELECT GROUP_CONCAT(pid) INTO sParentTemp FROM FBS_SYS_ORG WHERE FIND_IN_SET(id,sParentTemp)>0;   
  20.         END WHILE;   
  21.         RETURN sParentList;   
  22.     END$$  
  23.   
  24. DELIMITER ;  
  25.   
  26. -- 调用  
  27. SELECT * FROM FBS_SYS_ORG WHERE FIND_IN_SET(id, getParentList('31d8633768a9459d98c9ced15d528cd0'));  
  28.   
  29. ----------------------------------------------------------------------------------------------------------------------  
  30.   
  31. -- 获取子节点树  
  32. DROP FUNCTION IF EXISTS `getChildList`;  
  33. DELIMITER $$  
  34.   
  35.   
  36. CREATE FUNCTION `getChildList`(rootId VARCHAR(100)) RETURNS VARCHAR(10000) CHARSET utf8  
  37. BEGIN  
  38.    DECLARE sChildList VARCHAR(10000);  
  39.    DECLARE sChildTemp VARCHAR(1000);  
  40.      
  41.    SET sChildTemp =rootId;  
  42.      
  43.    WHILE sChildTemp IS NOT NULL DO  
  44.      IF (sChildList IS NOT NULLTHEN   
  45.         SET sChildList = CONCAT(sChildTemp,',',sChildList);   
  46.      ELSE   
  47.         SET sChildList = CONCAT(sChildTemp);   
  48.      END IF;   
  49.        
  50.      SELECT GROUP_CONCAT(id) INTO sChildTemp FROM fbs_sys_org WHERE FIND_IN_SET(pid, sChildTemp)>0;  
  51.    END WHILE;  
  52.    RETURN sChildList;  
  53.  END$$  
  54.   
  55. DELIMITER ;  
  56.   
  57. --调用  
  58. SELECT * FROM FBS_SYS_ORG WHERE FIND_IN_SET(pid, getChildList('2a597432c97e4111856213ed52b59e64'));  
  59.   
  60. ----------------------------------------------------------------------------------------------------------------------  
  61.   
  62. -- 查询两者之间的节点数  
  63. DROP FUNCTION IF EXISTS `getBetweenNodes`;  
  64. DELIMITER $$  
  65.   
  66.   
  67. CREATE FUNCTION `getBetweenNodes`(startNodeId VARCHAR(100), endNodeId VARCHAR(100)) RETURNS VARCHAR(10000) CHARSET utf8  
  68. BEGIN  
  69.    DECLARE sBetweenNodes VARCHAR(10000);  
  70.    SELECT GROUP_CONCAT(id) INTO sBetweenNodes FROM FBS_SYS_ORG WHERE FIND_IN_SET(id, getParentNodes(endNodeId)) AND FIND_IN_SET(pid, getChildNodes(startNodeId));  
  71.    RETURN sBetweenNodes;  
  72.  END$$  
  73.   
  74. DELIMITER ;  
  75.   
  76. --调用  
  77. SELECT * FROM FBS_SYS_ORG WHERE FIND_IN_SET(id, getBetweenNodes('2a597432c97e4111856213ed52b59e64''31d8633768a9459d98c9ced15d528cd0'));  
  78.   
  79. --或者不定义该函数而直接用sql调两次:  
  80. SELECT * FROM FBS_SYS_ORG WHERE FIND_IN_SET(id, getParentNodes('31d8633768a9459d98c9ced15d528cd0')) AND FIND_IN_SET(pid, getChildNodes('2a597432c97e4111856213ed52b59e64'));  
  81.   
  82. ----------------------------------------------------------------------------------------------------------------------  
  83.   
  84. --若没有定义getParentNodes()函数和getChildNodes()函数,则如下实现:  
  85. DROP FUNCTION IF EXISTS `getBetweenNodes`;  
  86. DELIMITER $$  
  87.   
  88. CREATE FUNCTION `getBetweenNodes`(startNodeId VARCHAR(100), endNodeId VARCHAR(100)) RETURNS VARCHAR(10000) CHARSET utf8  
  89. BEGIN  
  90.    DECLARE sBetweenNodes VARCHAR(10000);    
  91.    DECLARE sParentNodes VARCHAR(10000);     
  92.    DECLARE sParentNodeTemp VARCHAR(10000);  
  93.    DECLARE sChildNodes VARCHAR(10000);      
  94.    DECLARE sChildNodeTemp VARCHAR(10000);   
  95.      
  96.    SET sChildNodeTemp =startNodeId;  
  97.      
  98.    WHILE sChildNodeTemp IS NOT NULL DO  
  99.      IF (sChildNodes IS NOT NULLTHEN   
  100.         SET sChildNodes = CONCAT(sChildNodeTemp,',',sChildNodes);   
  101.      ELSE   
  102.         SET sChildNodes = CONCAT(sChildNodeTemp);   
  103.      END IF;   
  104.        
  105.      SELECT GROUP_CONCAT(id) INTO sChildNodeTemp FROM fbs_sys_org WHERE FIND_IN_SET(pid, sChildNodeTemp)>0;  
  106.    END WHILE;  
  107.      
  108.    SET sParentNodeTemp =endNodeId;  
  109.      
  110.    WHILE sParentNodeTemp IS NOT NULL DO   
  111.         IF (sParentNodes IS NOT NULLTHEN   
  112.             SET sParentNodes = CONCAT(sParentNodeTemp,',',sParentNodes);   
  113.         ELSE   
  114.             SET sParentNodes = CONCAT(sParentNodeTemp);   
  115.         END IF;   
  116.           
  117.         SELECT GROUP_CONCAT(pid) INTO sParentNodeTemp FROM FBS_SYS_ORG WHERE FIND_IN_SET(id, sParentNodeTemp)>0;   
  118.    END WHILE;   
  119.      
  120.    SELECT GROUP_CONCAT(id) INTO sBetweenNodes FROM fbs_sys_org WHERE FIND_IN_SET(id, sParentNodes) AND FIND_IN_SET(pid, sChildNodes);  
  121.      
  122.    RETURN sBetweenNodes;  
  123.  END$$  
  124.   
  125. DELIMITER ;  
posted @ 2020-04-24 15:49  liuminchao  阅读(5742)  评论(0编辑  收藏  举报