MySQL 递归查询实现方法 MySQL 递归查询是指在 MySQL 中实现类似 Oracle Hierarchical Queries 的功能,用于查询树形结构中的所有子节点。由于 MySQL 目前还没有内置的递归查询功能,因此需要使用其他方法来实现。 第一种方法:使用函数来得到所有子节点号 该方法是使用 MySQL 的存储过程来实现递归查询。创建一个函数 `getChildLst`,该函数将返回一个由所有子节点号组成的字符串。该函数使用 WHILE 循环来递归地查找所有子节点,并使用 `FIND_IN_SET` 函数来判断当前节点是否是子节点。 创建 `getChildLst` 函数的 SQL 语句如下: ```sql CREATE FUNCTION `getChildLst`(rootId INT) RETURNS varchar(1000) BEGIN DECLARE sTemp VARCHAR(1000); DECLARE sTempChd VARCHAR(1000); SET sTemp = '$'; SET sTempChd = cast(rootId as CHAR); WHILE sTempChd is not null DO SET sTemp = concat(sTemp,',',sTempChd); SELECT group_concat(id) INTO sTempChd FROM treeNodes where FIND_IN_SET(pid,sTempChd)>0; END WHILE; RETURN sTemp; END; ``` 使用 `getChildLst` 函数可以直接查找所有子节点,例如: ```sql mysql> select getChildLst(1); ``` 这将返回所有子节点的 ID,包括直接子节点和间接子节点。 第二种方法:使用存储过程来实现递归查询 该方法是使用 MySQL 的存储过程来实现递归查询。创建一个存储过程 `sp_getChildNodes`,该过程将递归地查找所有子节点,并将结果存储在一个临时表中。然后,使用该临时表来查找所有子节点。 创建 `sp_getChildNodes` 存储过程的 SQL 语句如下: ```sql CREATE PROCEDURE `sp_getChildNodes`(rootId INT) BEGIN DECLARE sTemp VARCHAR(1000); DECLARE sTempChd VARCHAR(1000); DROP TEMPORARY TABLE IF EXISTS tempChildNodes; CREATE TEMPORARY TABLE tempChildNodes (id INT); INSERT INTO tempChildNodes VALUES (rootId); WHILE 1=1 DO INSERT INTO tempChildNodes SELECT id FROM treeNodes WHERE pid IN (SELECT id FROM tempChildNodes); IF ROW_COUNT()=0 THEN LEAVE; END IF; END WHILE; SELECT * FROM tempChildNodes; END; ``` 使用 `sp_getChildNodes` 存储过程可以直接查找所有子节点,例如: ```sql mysql> CALL sp_getChildNodes(1); ``` 这将返回所有子节点的信息,包括直接子节点和间接子节点。 第三种方法:使用程序语言来实现递归查询 该方法是使用程序语言(如 Java、Python 等)来实现递归查询。在程序中,使用循环遍历来查找所有子节点,并将结果存储在一个数据结构中。 例如,在 Java 中,可以使用以下代码来实现递归查询: ```java public List<Integer> getChildNodes(int rootId) { List<Integer> childNodes = new ArrayList<>(); getChildNodesRecursive(rootId, childNodes); return childNodes; } private void getChildNodesRecursive(int parentId, List<Integer> childNodes) { List<Integer> children = getChildren(parentId); for (Integer childId : children) { childNodes.add(childId); getChildNodesRecursive(childId, childNodes); } } private List<Integer> getChildren(int parentId) { // 使用 MySQL 查询子节点 String sql = "SELECT id FROM treeNodes WHERE pid = ?"; // 执行查询并返回结果 } ``` 这些方法可以用于实现 MySQL 递归查询,每种方法都有其优缺点,选择哪种方法取决于具体的应用场景。
















剩余6页未读,继续阅读

- chendeyunhuangjian2014-07-11不错,我受益很多

- 粉丝: 0
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 【IOS应用源码】WeatherMap-1.zip
- 【IOS应用源码】WeatherParser 3.zip
- 【IOS应用源码】WindowTitleMenu.zip
- 【IOS应用源码】WebiPadTest.zip
- 【IOS应用源码】WorldCities.zip
- 【IOS应用源码】WorldCities-1.zip
- 【IOS应用源码】xemus-cocos2d-GestureRecognizers.zip
- 【IOS应用源码】yanzheng-match_game.zip
- 【IOS应用源码】YoukuVideoDemo 2.zip
- 【IOS应用源码】yooyke-iScrash-4f9c9b2.zip
- 【IOS应用源码】yeag123-TextFightConcept.zip
- 【IOS应用源码】YoukuVideoDemo.zip
- 【IOS应用源码】YUChoe-q_boardgame-d24902f.zip
- 【IOS应用源码】Zanneth-Chain-Disaster-8832785.zip
- 【IOS应用源码】Zip解压For百度.zip
- 【IOS应用源码】ZipArchive.zip


