作为一个例子,我有一个这样的表:
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正确显示它们。
我需要它显示如下:
......等......用户创建它们的深度。
我只是很难理解这是如何运作的逻辑。谢谢你的帮助!
答案 0 :(得分:3)
使用CF特定的查询查询来执行此操作。因此,您首先查询所有文件夹,然后使用Query-of-Query在CF中迭代它并处理树的每个子部分。
我认为这个答案可以指出你的方向:
答案 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>