2012-05-07 59 views
0

我有一个查询结果类似ColdFusion的遍历查询

ID IDParent Name Title 
-------------------------------------- 
1 -1 Test1  Test1_Title 
2 -1  Test2  Test2_Title 
3 -1  Test3  Test3_Title 
4 2 SubTest2 SubTest2_Title 
5 2 SubTest3 SubTest3_Title 
6 2 SubTest4 SubTest4_Title 
7 3 SubTest6 SubTest8_Title 
8 3 SubTest8 SubTest10_Title 

与菜单和子菜单options.I要循环菜单选项,其中IDParent为-1,每个菜单项后,其中IDParent -1我想要循环其子项目。

当循环查询时,Coldfusion是否提供了这样的分组?

感谢

回答

4

这是与查询的查询(环比)和一点点递推很简单:

<!-- database query, sorted in the way you want to display the results --> 
<cfquery name="Menu" datasource="#YourDSN#"> 
    SELECT ID, IDParent, Name, Title 
    FROM  Menu 
    ORDER BY Name 
</cfquery> 

<!-- output menu --> 
<cfset OutputQueryRecursive(Menu, -1)> 

<!-- support function --> 
<cffunction name="OutputQueryRecursive"> 
    <cfargument name="BaseQuery" type="query" required="yes"> 
    <cfargument name="ParentId" type="numeric" required="yes"> 

    <cfquery name="CurrLevel" dbtype="query"> 
    SELECT * FROM BaseQuery WHERE IDParent = #ParentId# 
    </cfquery> 

    <cfif CurrLevel.RecordCount gt 0> 
    <ul> 
     <cfoutput query="CurrLevel"> 
     <li id="menu_#ID#"> 
      <span title="#HTMLEditFormat(Title)#">#HTMLEditFormat(Name)#</span> 
      <cfset OutputQueryRecursive(BaseQuery, ID)> 
     </li> 
     </cfouptut> 
    </ul> 
    </cfif> 
</cffunction> 
5

CFOUTPUT支持查询分组为好。

<cfquery name="qGetTests" datasource="#DSN#"> 
    SELECT ID, IDParent, Name, Title 
    FROM  Menu 
    ORDER BY IDParent, Name 
</cfquery> 

<cfoutput query="qGetTests" group="IDParent"> 
    #IDParent#<br /> 
    <cfoutput> 
     #ID# #Name# #Title#<br /> 
    </cfoutput> 
</cfoutput> 
+0

是的,但这种正确不窝输出。 – Tomalak

+0

您希望如何显示数据?这应该会给你足够的信息来按照你想要的方式显示输出格式 –

1

如果您有SQL生成查询结果的任何控制,你可以考虑让数据库,让你的数据在后面摆在首位正确的格式。对于Oracle和SQL Server的方法是覆盖here并有一些选项对MySQL here

如果你的菜单数据总是要小,那么就会有与托默勒格的解决方案没有问题,但如果你曾经打算有大量的菜单项,然后我会测试它仍然可以正常工作。

+1

如果有很多深层嵌套的菜单选项,我会用一个循环来建立一个索引(一个Struct),它可以按照父ID来组织项目第二个循环使用该索引构建菜单,而不是查询查询。如果不需要改变数据库结构,这将会很快。 – Tomalak

0

考虑qTestQuery包含的值

<cfset qTestQuery1 = qTestQuery> 
<cfloop query="qTestQuery"> 
    <cfif qTestQuery.IDParent eq -1> 
     <span class="main-menu">#qTestQuery.name#</span> 
    </cfif> 
    <cfset local.parentId = qTestQuery.IDParent> 
    <cfloop query="qTestQuery1"> 
     <cfif qTestQuery1.IDParent eq local.parentId> 
       <span class="sub-menu">#qTestQuery1.name#</span> 
     </cfif> 
    </cfloop> 
</cfloop>