mysql递归查询子节点的自定义函数的替代方法

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;
     }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值