【问题标题】:Coldfusion Looping over queryColdfusion循环查询
【发布时间】:2012-05-07 09:45:33
【问题描述】:

我有一个类似的查询结果

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 在循环查询时是否提供这样的分组?

谢谢

【问题讨论】:

    标签: coldfusion


    【解决方案1】:

    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>
    

    【讨论】:

    • 您希望数据如何显示?这应该为您提供足够的信息以按照您希望的方式格式化输出
    【解决方案2】:

    使用 Query of Queries (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>
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 如果有许多深度嵌套的菜单选项,我会使用一个循环来构建一个可以按父 ID 组织项目的索引(一个结构),并使用第二个循环来构建使用该索引的菜单而不是查询的查询。这将非常快,无需更改数据库结构。
      【解决方案4】:

      考虑 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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多