【问题标题】:Coldfusion & SQL to create recursive treeColdfusion & SQL 创建递归树
【发布时间】:2015-03-18 00:34:49
【问题描述】:

更新

我有一个非常独特的案例,我从我的 SQL 数据库中获得了这个。

+------+-------+-------+-------+-------+
| LVL  | LVL_1 | LVL_2 | LVL_3 | LVL_4 |
+------+-------+-------+-------+-------+
| PHIL | NULL  | NULL  | NULL  | NULL  |
| PHIL | BOB   | NULL  | NULL  | NULL  |
| PHIL | BOB   | BILL  | NULL  | NULL  |
| PHIL | BOB   | BILL  | JEN   | NULL  |
| PHIL | BOB   | BILL  | JEN   | JOE   |
+------+-------+-------+-------+-------+

最后一个包含名字的 LVL 列代表这个人。

例如,这代表PHIL

| PHIL | NULL  | NULL  | NULL  | NULL  |

这代表JEN

| PHIL | BOB   | BILL  | JEN   | NULL  |

这代表JOE(因为他是最后一级)

| PHIL | BOB   | BILL  | JEN   | JOE  |

我的最终目标是在我查询“PHIL”时将这些数据从 ColdFusion 返回到 JSON 树结构中:

{
  name: 'PHIL',
  parent: NULL,
  level: 0,
  groups: [
    {
      name: 'BOB',
      parent: 'PHIL',
      level: 1,
      groups: [
        {
          name: 'BILL',
          parent: 'BOB',
          level: 2,
          groups: [
            {
              name: 'JEN',
              parent: 'BILL',
              level: 3,
              groups: [
                {
                  name: 'JOE',
                  parent: 'JEN',
                  level: 4,
                  groups: []
                }
              ]
            }
          ]
        }
      ]
    }
  ]
}

如果我查询'BILL',我只能看到他下面的树数据是这样的:

    {
      name: 'BILL',
      parent: 'BOB',
      level: 2,
      groups: [
        {
          name: 'JEN',
          parent: 'BILL',
          level: 3,
          groups: [
            {
              name: 'JOE',
              parent: 'JEN',
              level: 4,
              groups: []
            }
          ]
        }
      ]
    }

我想编写一些 SQL 命令来生成这些数据的树形结构。如果不可能,我想至少将原始数据重新格式化(使用 SQL 命令):

+------+--------+
| NAME | PARENT |
+------+--------+
| PHIL | NULL   |
| BOB  | PHIL   |
| BILL | BOB    |
| JEN  | BILL   |
| JOE  | JEN    |
+------+--------+

所以我或许可以按照本教程 http://www.bennadel.com/blog/1069-ask-ben-simple-recursion-example.htm 使用 ColdFusion 将其重组为树数据

有可能吗?有人可以帮我解决这个问题吗?

【问题讨论】:

  • 第 1 步是编写一个获取数据的查询。要获得帮助,请编辑您的问题以显示数据库结构的相关部分。
  • 看看 CTE 是如何工作的:technet.microsoft.com/en-us/library/…。但还要检查这是否是最好的分层模型。无论您决定什么,数据库处理都属于数据库,但不属于 CFML 方面。
  • “groups”数组的顺序重要吗?
  • groups 数组的顺序无关紧要
  • 它们是从SQL数据库的表中给出的列名

标签: sql sql-server recursion coldfusion tree


【解决方案1】:
<cfscript>
q = queryNew("LTM,LTM_1,LTM_2,LTM_3,LTM_4");

queryAddRow(q);
QuerySetCell(q, "LTM", "OSTAPOWER");
QuerySetCell(q, "LTM_1", "VENKAT");
QuerySetCell(q, "LTM_2", "LYNN");
QuerySetCell(q, "LTM_3", "SMITH");
QuerySetCell(q, "LTM_4", "HARTLEY");

queryAddRow(q);
QuerySetCell(q, "LTM", "OSTAPOWER");
QuerySetCell(q, "LTM_1", "VENKAT");
QuerySetCell(q, "LTM_2", "LYNN");
QuerySetCell(q, "LTM_3", "SMITH");
QuerySetCell(q, "LTM_4", "SHREVE");

function collect(q) {
    var data = {};
    for (var row in q)
    {
        var varName = "data";
        for (var i = 0; i <= 4; i++)
        {
            var col = i == 0 ? "LTM" : "LTM_#i#";
            var name = row[col];
            if (len(name))
                varName = listAppend(varName, name, ".");
            else
                break;
        }
        setVariable(varName, {});
    }

    return data;
}

function transform(tree, nodeName, level=0, parent="") 
{
    if (structIsEmpty(tree))
        return "";

    var node = {
        'name': nodeName,
        'parent': len(parent) ? parent : javacast("null",""),
        'level': javacast("int", level),
        'groups': []
    };

    var branch = tree[nodeName];

    for (var child in branch)
        arrayAppend(node.groups, transform(branch, child, level+1, nodeName));

    return node;
}

c=collect(q);

writeDump(transform(c,'OSTAPOWER'));
</cfscript>

运行它:http://www.trycf.com/scratch-pad/pastebin?id=c8YMvGXG

然后就是serializeJSON()transform()返回的结果。

【讨论】:

  • 我刚刚尝试运行它,但我收到此错误:“解析代码时出错。这通常表示缺少 ; 或另一个编译时语法错误。请检查您的语法并重试。”你知道会是什么吗?但是非常感谢您抽出宝贵的时间来做这一切。
  • 另外,我不确定您的代码是否已经在执行此操作(因为我运行了一个错误),但我忘了包含最后一个重要功能。反正我也不想让你迷惑,所以想着一步步给你解释。假设我正在搜索 Ostapower,我想为他下面的人创建一个树形菜单(没有 Amoroso、Saxena 和其他 LTM 0 级)。如果我是 Smith,我只能看到他下面的 LTM 级别的树数据(没有 Ostapower、Vencat 或 Lynn)。希望您能提供帮助,但如果您没有时间,我当然不介意。你对我的帮助已经够多了!!
  • 再次在 trycf.com 上运行。代码运行良好。是的,它只返回OSTAPOWER,见最后一行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-02
  • 2011-05-08
  • 2017-09-21
  • 2012-08-23
相关资源
最近更新 更多