繁体   English   中英

建立树数据结构形式的mysql表递归问题

[英]building tree datastructure form mysql table recursion issue

我正在尝试从存储在mysql表中的数据(自引用)构建递归结构形式,这意味着某些行可以成为其他行的父级,这是我拥有的演示数据 在此处输入图片说明

生成的树应该是一棵树,该树用我设法生成的代码显示孩子的父母之间的关系 在此处输入图片说明 问题是bio4缺少其子bio5我认为问题是,当我们在同一级别有两个上级父母时,第一个在正常工作,但是当递归结束并且回溯到其他级别时,第二个子级父母变为null到目前为止,这是我主要路线中的代码,我还使用了knex.js和accesscontrol.js模块

router.get('/',async  function (req, res, next) {
 const permission = ac.can(req.user.role).readAny("test");
 if (!permission.granted)
    res.status(401).send("Insufficient Permission");

 testgroups = await db(`servicegroups`).select("*","ServiceGroupId AS id","Name AS text ",db.raw(`(SELECT "root" ) AS type`) ).where("ServiceGroupType", '=', 2).andWhere("ParentId", '=', 0).andWhere("Deleted",'=',0).select();
 var result = [];
 for(i in testgroups){
    result.push(testgroups[i])
    await global.getTestChildrens(testgroups[i], db);         
 }
 res.render("admin/lis/tests/tests",{user:req.user , data:{testgroups:JSON.stringify(result) } })

});

同样,主要功能也是这样。请注意,global只是我在系统中使用的全局变量,其中有几个重要功能要使用,其中一个是递归函数,而db只是我数据库连接的knex实例

global.getTestChildrens =async  function (entity,db) {

 childs = await db('servicegroups').select("*", "ServiceGroupId AS id", "Name AS text ", db.raw(`(SELECT "subroot" ) AS type`)).where("ParentId", '=', entity.ServiceGroupId).andWhere("Deleted", '=', 0);
 if(childs.length>0){
    entity.children = childs;
 }else{
    entity.type = "leaf";
 }
 for(i in childs){        
    if (childs[i]){
        await global.getTestChildrens(childs[i], db);
    }else{
        console.log("undifened found :"+i)
    }
 }
 return entity;    
}

该解决方案似乎非常愚蠢,但解决方案是我把

const

子变量内部之前的关键字

getTestChildrens 

功能和问题解决了,我改变了树的关系,它适用于所有测试用例 在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM