SQL/Coldfusion — получение и отображение полного иерархического древовидного списка

Например, у меня есть такая таблица:

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.

Мне нужно, чтобы это отображалось так:

  • Главный
  • Departments
    • IT
      • Error Logs
        • 2012
    • Продажи
  • В архиве

...и т.д... Идем настолько глубоко, насколько пользователь их создает.

Мне просто трудно понять логику того, как это будет работать. Спасибо за любую помощь!


person RandyLahey    schedule 21.03.2013    source источник
comment
Можете ли вы обновить теги, указав тип и версию вашей базы данных?   -  person Leigh    schedule 21.03.2013
comment
Да, только что, sql server 2008.   -  person RandyLahey    schedule 21.03.2013
comment
Вы также можете выполнить быстрый поиск по CTE и иерархии на сервере sql. Существует тонна примеров. Мне было бы любопытно, как один запрос CTE сравнивается с использованием рекурсивного QoQ.   -  person Leigh    schedule 21.03.2013


Ответы (2)


Для этого используйте специальный запрос запросов CF. Таким образом, вы сначала запрашиваете все папки, затем перебираете их в CF, используя Query-of-Query, и обрабатываете каждую часть дерева.

Я думаю, что этот ответ может указать вам направление:

Создание вложенной древовидной структуры ‹ul› из ParentID в БД

person Cody Caughlan    schedule 21.03.2013

Для тех, кто ищет ответ, я взял код из ссылки Коди и заставил его работать на меня (поскольку он работал не совсем правильно). Спасибо Коди и Киарану! Вот:

<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>
person RandyLahey    schedule 21.03.2013