在树型结构中如何从数据库中查询并显示子节点!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在树型结构中如何从数据库中查询并显示子节点!相关的知识,希望对你有一定的参考价值。

参考技术A 先根据父编码排序,父编码相同的情况下再根据子编码排序
SELECT id,name
FROM [Table1]
ORDER BY ISNULL(sjbm,0)+'.',id

不确定你的sjbm是什么类型的,假如是int型的话,就要判断为NULL值的情况,对你给的数据分析,顶级数据的sjbm值可能是空的

产生的结果应该是
1 a
2 b 1
4 d 1
3 c 2
5 e 4
6 f 4

但是这样只能实现二级项排序,对于你现有的数据,应该是3级项,可以实现,但如果是N级项的话,就只能在存储过程里实现了
以下是3级项排序的实现方法,其中的排序值就是各项Id,以“.”分隔:

--1级项,sjbm为空,排序值为(x)
SELECT id,name ,id orderId
FROM [Table1]
WHERE sjbm IS NULL

union all
--2级项,sjbm与1级项的id相等,排序值为(x.y)
SELECT id,name ,[lv1].id + '.' + [lv2].id
FROM [Table1] AS [lv2]
INNER JOIN
(
SELECT id
FROM [Table1]
WHERE sjbm IS NULL
) AS [lv1] ON [lv2].sjbm = [lv1].id

UNION ALL
--3级项,sjbm与2级项的id相等,排序值为(x.y.z)
SELECT id,name ,[lv2].sjbm + '.' + [lv2].id + '.' + [lv3].id
FROM [Table1] AS [lv3]
INNER JOIN
(
SELECT id,name,sjbm
FROM [Table1]
WHERE sjbm IN
(
SELECT id
FROM [Table1]
WHERE sjbm IS NULL
) AS [lv2] ON [lv3].sjbm=[lv2].id
ORDER BY orderId

如果显示OrderId的话,应该如下结果
1 a 1
2 b 1.2
3 c 1.2.3
4 d 1.4
5 e 1.4.5
6 f 1.4.6

本回答被提问者采纳
参考技术B 你是想从数据库中查出来一个树呢,还是什么别的? 参考技术C 没搞过,顶!

如何在树中遍历并过滤javascript中的匹配节点?

我试图过滤节点,但成功只过滤根节点。我的实现如下。如何使用方法过滤子节点?

  function getMatchedValues(nodes)
    {
        var leafContainsText = false;

        for (var i = 0; i < nodes.length; i++)
        {
            if (nodes[i].items && nodes[i].items.length > 0)
            {
                leafContainsText = getMatchedValues(nodes[i].items);
                if (leafContainsText)
                    break;
            }
            else
            {
                if (nodes[i].text.toLowerCase().indexOf($scope.filterReports.toLowerCase()) !== -1)
                {
                    leafContainsText = true;
                    break;
                }                        
            }
        }

        return leafContainsText;
    }


 $scope.temp_reports = [];

        for (var i = 0; i < $scope.reports.length; i++)
        {
            if ($scope.reports[i].items && $scope.reports[i].items.length > 0)
            {
                if (getMatchedValues($scope.reports[i].items))
                    $scope.temp_reports.push($scope.reports[i]);
                else if ($scope.reports[i].text.toLowerCase().indexOf($scope.filterReports.toLowerCase()) !== -1)
                    $scope.temp_reports.push($scope.reports[i]);
            }
            else
            {
                if ($scope.reports[i].text.toLowerCase().indexOf($scope.filterReports.toLowerCase()) !== -1)
                    $scope.temp_reports.push($scope.reports[i]);
            }
        }

树对象($ scope.reports)如下所示:

     [
       {
          text:"abc",
          items:[
             {
                text:"abf"
             },
             {
                text:"abd",
                items:[
                   {
                      text:"bbb"
                   },
                   {
                      text:"dba"
                   }
                ]
             }
          ]
       },
       {
          text:"def",
          items:[
             {
                text:"ddf"
             },
             {
                text:"ddd",
                items:[
                   {
                      text:"dfg"
                   },
                   {
                      text:"dba",
                      items:[
                         {
                            text:"qqq"
                         },
                         {
                            text:"www"
                         }
                      ]
                   }
                ]
             }
          ]
       }
    ]

例如,如果要过滤包含“d”的节点,则结果树应如下所示;

         [
       {
          text:"abc",
          items:[
             {
                text:"abd",
                items:[
                   {
                      text:"dba"
                   }
                ]
             }
          ]
       },
       {
          text:"def",
          items:[
             {
                text:"ddf"
             },
             {
                text:"ddd",
                items:[
                   {
                      text:"dfg"
                   },
                   {
                      text:"dba",
                      items:[]
                   }
                ]
             }
          ]
       }
    ]
答案

您也可以通过过滤items数组来过滤数组。

该解决方案改变了原始数据。

function filter(array, search) {
    return array.filter(function f(o) {
        var t;

        if (o.items) {
            t = o.items.filter(f);
        }
        if (o.text.includes(search) || t && t.length) {
            if (t) {
                o.items = t;
            }
            return true;
        }
    });
}

var array = [{ text: "abc", items: [{ text: "abf" }, { text: "abd", items: [{ text: "bbb" }, { text: "dba" }] }] }, { text: "def", items: [{ text: "ddf" }, { text: "ddd", items: [{ text: "dfg" }, { text: "dba", items: [{ text: "qqq" }, { text: "www" }] }] }] }],
    result = filter(array, 'd');

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

以上是关于在树型结构中如何从数据库中查询并显示子节点!的主要内容,如果未能解决你的问题,请参考以下文章

迭代时如何知道我在树的末尾?

P1364 医院设置(树型结构)

创建无限极分类树型结构

JavaSE——数据结构二叉树红黑树

在树结构上递归调用任务

如何在树中遍历并过滤javascript中的匹配节点?