mysql没有给出递归方法,需要自定义实现函数,但是在数据库部署的时候,函数往往会被遗漏(比如使用Navicat导出数据库时,自定义函数可能不会被导出),而且自定义函数相比之下不便于维护。在这种自定义函数不受欢迎的情况下,可不可以采用别的方法实现查询子节点功能呢,比如放到java中实现。
具体实现思路:比如查找一个节点的子节点,
首先查询出全部数据,再通过循环+递归得到所有的子节点,这种方法在数据量不大的情况下时间花费比较高,不太合适。
可以考虑使用前端实现,如果前端是使用树插件来展示数据,可以通过树结构递归得到所有的子节点,再通过后端获取对应的数据。同样的数据条件下,比后端循环+递归的方式要快。(结论不具有普遍性,没有理论支持,只是现场环境下的测试结论)
后台递归实现:
/**
* 递归实现获得所有子节点
* @param id 待查询节点
* @param nodeList 节点集合
* @return
*/
List<String> findNodeChildren(String id,List<Map> nodeList){
List<String> list = new ArrayList<>();
for(Map node : nodeList){
String nodeId = node.get("id") == null ? "":node.get("id").toString();
String parent = node.get("parent") == null ? "" : node.get("parent").toString();
//如果该节点为子节点,就收集子节点id
if(parent.equals(id)){
list.add(nodeId);
list.addAll(findNodeChildren(nodeId,nodeList));
}
}
return list;
}
前台插件递归实现,以bootstrap-treeview控件为例:
//获得选中节点的所有子节点
function getChildrenNode(nodeData){
var array = [];
var children = nodeData.nodes;
if(children){
children.forEach( function(item){
array.push(item.id);
array = array.concat(getChildrenNode(item));
} );
}
return array;
}