Coldfusion循环查询

时间:2012-05-07 09:45:33

标签: 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

带有菜单和子菜单选项。我想循环遍历IDParent为-1的菜单选项,并在每个菜单项之后循环IDParent -1我想循环其子项。

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

由于

4 个答案:

答案 0 :(得分: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>

答案 1 :(得分:4)

查询查询(QoQ)和一点递归非常简单:

<!-- 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>

答案 2 :(得分:1)

如果您对生成该查询结果的SQL有任何控制权,您可以考虑让数据库首先以正确的格式返回数据。涵盖了Oracle和SQL服务器的方法here并且mySQL here有一些选项

如果您的菜单数据总是很小,那么Tomalak的解决方案就没有问题了,但是如果您有大量的菜单项,那么我会测试它仍然可以正常运行。

答案 3 :(得分: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>