1

我拥有的是存储在 Oracle 中的一堆类别和子类别。这种关系仅以一种方式表示:每一行都有一个 categoryid 和一个 parentid,如果它有一个,则它是该行的父级的 categoryid。如果没有父级,则 parentid 为 0。即:

工具: categoryid,1;父母,0

材料: categoryid,2;父母,0

锤子: categoryid,3;父母,1

钉子: categoryid,4;父母,2

等等

在另一张桌子上,我有物品。它们每个都有唯一的 ID 和相关的 categoryid:

短指甲: itemid,1个;类别ID,4

长指甲: itemid,2;类别ID,4

双面: itemid,3;类别ID,3

橡胶: itemid,4;类别ID,3

等等

我正在使用coldfusion 构建一个“浏览类别”网络应用程序。当他们选择一个类别时,结果表应该从所选类别中提取所有项目,以及该类别子类别中的项目。也就是说,如果使用选择的类别工具,则没有项目的 categoryid 为 1,但有两个项目的 categoryid 为 3,这是工具的子类别,因此应显示这些项目:

单击“工具”链接>>显示双面和橡胶锤

我现在遇到的问题是无法判断类别的范围。类别列表可能有数百行长,类别/子类别关系种类繁多。目前,有一个 6 级深的子类别。

我的问题是我应该如何构造我的查询而不用无休止的“如果一个类别的父 id 为任何然后查询项目”?这不可能是唯一的方法。查询具有所选 categoryid 的 parentid 的类别,然后查询具有在上一个查询中找到的那些类别的 parentid 的类别,然后用新结果再次重复,然后用新结果再次重复,每次以指数方式增加查询的数量 I将是手工编码!

我最初的反应是这样做:循环一个最初填充有第一个“parentid 查询”的数组。当它循环通过时,查询每个数组项的 parentid。如果找到任何东西,请将其添加到当前循环的数组中。像这样的东西:

<!--- populate Inital 'parentid query' array --->
<cfset newArray = ArrayNew(1)>
<cfloop from="1" to="10" index="i">
    <cfset #ArrayAppend(newArray,i)#>
</cfloop>

<!--- if parentid is found for index, add to newArray --->
<cfloop array="#newArray#" index="i">
    <query for parentid with 'i'>
    <if successful>
        ArrayAppend(newArray,everythingTheQueryFoundWithParentIdOfI)
    </if>
</cfloop>

但是我发现在循环中附加到数组是有效的代码,但实际上并没有增加循环的迭代次数。:/ 将循环设置为整数变量并增加它。有什么想法我能做什么?感谢您阅读我的长文哈哈

4

1 回答 1

0

您的查询可以使用 connect_by 语法:

SELECT cat.cat_desc, items.item_desc
  FROM cat JOIN items ON cat.category_id = items.category_id
 START WITH cat.category_id = 1  -- ID of the starting category
 CONNECT BY PRIOR cat.category_id = cat.parent_category_id;
于 2012-08-13T22:30:51.443 回答