为了账号安全,请及时绑定邮箱和手机立即绑定

以有效和简单的方式实现等级,父/子关系

以有效和简单的方式实现等级,父/子关系

慕姐8265434 2019-08-05 15:24:50
以有效和简单的方式实现等级,父/子关系我有一张桌子create table site(site_Id int(5),parent_Id int(5),site_desc varchar2(100));领域的意义:site_Id:网站的IDparent_Id:站点的父IDsite_desc:虽然与问题无关,但它有网站的描述要求是,如果我有一个site_id作为输入,我需要在网站下面标记所有ID。例如:                    A                   / \                  B   C                / | \ /\               D  E F G H              /\             I  J所有节点都是site_Id。该表包含如下数据:Site_id  | Parent_ID  |  site_desc _________|____________|___________  A       |   -1       |     B       |    A       |  C       |    A       |  D       |    B       |  E       |    B       |  F       |    B       |  I       |    D       |  J       |    D       |......A是B和C的父级,依此类推。如果B是给定的输入,那么查询需要获取D,E,I,F,J它目前通过循环中的多个查询来实现,但我想在最少数量的查询中实现这一点。我目前正在做的是::投票算法如下:Initially create a data set object which you will populate, by fetching data from the data base. Create a method which takes the parent id as parameter and returns its child nodes if present, and returns -1, if it doesnt have a child. Step1: Fetch all the rows, which doesn't have a parent(root) node.  Step2: Iterate through this result. For example if prod1 and prod2 are the initial returned nodes, in the resultset.  Iterating this RS we get prod1, and we insert a row in our DataSET obj.  Then we send the id of prod1 to getCHILD method, to get its child, and then again we iterate the returned resultset, and again call the getCHILD method, till we dont get the lowest node.我需要在数据模型约束中使用最佳优化技术。如果您有任何建议,请随时回答。请提出建议。提前致谢。
查看完整描述

3 回答

?
青春有我

TA贡献1784条经验 获得超8个赞

这恰好与你的问题你所描述:出给定的邻接表的,你想获得一个特定父的所有子节点 -也许在一维数组,你可以很容易地迭代。

您只需对数据库进行一次调用即可完成此操作,但有一些问题:您必须从表中返回所有行。MySQL不支持递归查询,因此您必须SELECT在应用程序代码中执行此操作。

我只是重申我上面链接的答案,但基本上如果你返回一个结果集(可能来自PDOStatement->fetchAll(PDO::FETCH_ASSOC)或其他方法),格式如下:

Array(
    [0] => Array
    (
        [site_id] => A        [parent_id] => -1
        [site_desc] => testtext    )
    [1] => Array
    (
        [site_id] => B        [parent_id] => A        [site_desc] => testtext    )
    [2] => Array
    (
        [site_id] => C        [parent_id] => A        [site_desc] => testtext    )
    [3] => Array
    (
        [site_id] => D        [parent_id] => B        [site_desc] => testtext    )
    [4] => Array
    (
        [site_id] => E        [parent_id] => B        [site_desc] => testtext    )
    [5] => Array
    (
        [site_id] => F        [parent_id] => B        [site_desc] => testtext    )
    [6] => Array
    (
        [site_id] => I        [parent_id] => D        [site_desc] => testtext    )
    [7] => Array
    (
        [site_id] => J        [parent_id] => D        [site_desc] => testtext    ))

您可以site_id使用此递归函数检索所有子/孙子/曾祖父/等等(如果您知道id):

function fetch_recursive($src_arr, $id, $parentfound = false, $cats = array()){
    foreach($src_arr as $row)
    {
        if((!$parentfound && $row['site_id'] == $id) || $row['parent_id'] == $id)
        {
            $rowdata = array();
            foreach($row as $k => $v)
                $rowdata[$k] = $v;
            $cats[] = $rowdata;
            if($row['parent_id'] == $id)
                $cats = array_merge($cats, fetch_recursive($src_arr, $row['site_id'], true));
        }
    }
    return $cats;}

例如,假设您想要检索所有子项site_id D,您将使用如下函数:

$nodelist = fetch_recursive($pdostmt->fetchAll(PDO::FETCH_ASSOC), 'D');print_r($nodelist);

输出:

[0] => Array(
    [site_id] => D    [parent_id] => B    [site_desc] => testtext)[1] => Array(
    [site_id] => I    [parent_id] => D    [site_desc] => testtext)[2] => Array(
    [site_id] => J    [parent_id] => D    [site_desc] => testtext)

请注意,我们保留父母及其子女,孙子等的信息(无论嵌套深度如何)。


查看完整回答
反对 回复 2019-08-05
  • 3 回答
  • 0 关注
  • 453 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信