SQL / Coldfusion - 获取并显示完整的分层树列表

时间:2013-03-21 15:40:27

标签: sql sql-server-2008 coldfusion tree hierarchical

作为一个例子,我有一个这样的表:

folder_id | parent_folder_id | folder_name
------------------------------------------
1         | null             | Main
2         | null             | Departments
3         | null             | Archived
4         | 2                | IT
5         | 2                | Sales
6         | 4                | Error Logs
7         | 6                | 2012

等...

我需要运行一个查询(如果多个也可以),以便能够循环并通过Coldfusion正确显示它们。

我需要它显示如下:

  • 主要
  • 部门
    • IT
      • 错误日志
        • 2012
    • 销售
  • 已归档

......等......用户创建它们的深度。

我只是很难理解这是如何运作的逻辑。谢谢你的帮助!

2 个答案:

答案 0 :(得分:3)

使用CF特定的查询查询来执行此操作。因此,您首先查询所有文件夹,然后使用Query-of-Query在CF中迭代它并处理树的每个子部分。

我认为这个答案可以指出你的方向:

Creating nested <ul> tree structure from ParentID's in a db

答案 1 :(得分:1)

对于寻找答案的人来说,我从Cody的链接中获取了代码并使其适用于我(因为它没有正常工作)。谢谢Cody和Ciaran!这是:

<cfquery name="get_folders" datasource="#application.dsn#">
    select folder_id, parent_folder_id, folder_name
    from folders
    order by folder_name
</cfquery>

<!--- Read all roots (no parent ID) --->
<cfquery name="get_parent_folders" dbtype="query">
    select folder_id, folder_name
    from get_folders
    where parent_folder_id is null
</cfquery>

<ul class="tree">
    <cfloop query="get_parent_folders">
        <cfset processTreeNode(folderId=get_parent_folders.folderId, folderName=get_parent_folders.folder_name) />
    </cfloop>
</ul>

<cffunction name="processTreeNode" output="true">
    <cfargument name="folderId" type="numeric" />
    <cfargument name="folderName" type="string" />
    <!--- Check for any nodes that have *this* node as a parent --->
    <cfquery name="LOCAL.qFindChildren" dbtype="query">
        select folder_id, folder_name
        from get_folders
        where parent_folder_id = <cfqueryparam value="#arguments.folderId#" cfsqltype="cf_sql_integer" />
    </cfquery>
    <li>#arguments.folderName#
        <cfif LOCAL.qFindChildren.recordcount>
            <!--- We have another list! --->
            <ul>
                <!--- We have children, so process these first --->
                <cfloop query="LOCAL.qFindChildren">
                    <!--- Recursively call function --->
                    <cfset processTreeNode(folderId=LOCAL.qFindChildren.folder_id, folderName=LOCAL.qFindChildren.folder_name) />
                </cfloop>
            </ul>
        </cfif>
    </li>
</cffunction>