2012-05-07 3 views
0

У меня есть результат запроса что-то вродеColdfusion Looping над запросом

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 I хотел бы связать его дочерние элементы.

Имеет ли coldfusion такую ​​группировку при циклировании запросов?

Благодаря

ответ

4

Это довольно просто с Query запросов (квартальном) и немного рекурсии:

<!-- 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 генерирующего, что результат запроса, вы могли бы рассмотреть возможность получения DB, чтобы получить Вас данные обратно в правильном формате, в первую очередь. Подходы к Oracle и SQL сервера покрыты here и есть несколько вариантов для MySql here

Если данные меню всегда будет мало, то не будет никаких проблем с решением Томалак, но если вы когда-нибудь имеют большое количество пунктов меню, тогда я бы проверил, что он все еще работает нормально.

+1

Если есть много, глубоко вложенных параметров меню, я бы использовал один цикл для создания индекса (Struct), который может организовывать элементы с помощью идентификатора родителя и второй цикл, который строит меню, используя этот индекс, а не запрос запросов. Это было бы очень быстро, без необходимости изменять структуру БД. – 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>