我所擁有的是一堆存儲在Oracle中的類別和子類別。關係只能用一種方式表示:每行都有一個分類標識和一個標識,如果標識有一個,那麼它就是該行父標的分類標識。如果沒有父代,則parentid爲0.即:如何構建未知級別鑽取的查詢
工具: categoryid,1; 0
材料:類別2, 0
錘子: categoryid,3; 1
指甲: categoryid,4; parentId的,2
等
在另一張表,我有一個項目。他們每個都有唯一的ID和相關的類別ID:
短指甲: itemid,1; 4
長指甲: itemid,2; categoryid,4
雙面: itemid,3; categoryid,3
rubber: itemid,4;類別ID,3
等
我建立使用ColdFusion一個 '瀏覽分類' 的Web應用程序。當他們選擇一個類別時,生成的表格應該從所選類別中提取所有項目,以及該類別子類別中的項目。也就是說,如果使用選擇的類別工具,則沒有項目的類別ID爲1,但是兩個項目具有類別3,這是工具的子類別,因此應顯示這些項目:
Clicks'Tools'鏈接>>雙面和橡皮錘顯示
我現在的問題是,沒有辦法告訴什麼類別的範圍。類別列表可能有數百行,各種分類/子類別關係種類繁多。目前,有一個6級深的子類別。
我的問題是我應該如何構建我的查詢沒有無盡'如果一個類別的父母ID爲無論然後查詢項目'?這不是唯一的方法。查詢具有所選類別ID的類別的類別,然後查詢在先前查詢中找到的那些類別的類別,然後再次用新結果重複,然後再次用新結果重複,每次按指數方式增加查詢數量I將手工編碼!
我最初的反應是這樣做的:循環一個數組,最初填充第一個'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>
但是我發現,追加到,同時在循環數組是合法的代碼,但實際上並沒有增加循環迭代。 :/將相同的循環設置爲一個整型變量並增加它。任何想法我可以做什麼?感謝您閱讀我長的帖子笑
你允許使用Oracle的'CONNECT BY'語法,它不分層查詢? – Tebbe 2012-08-13 21:01:10
確保你選擇另一個索引,如果你在一個循環內循環。 「......實際上並沒有增加循環的迭代」味道很有趣。 – Henry 2012-08-13 21:48:49
因此,創建一個初始值爲1-10的數組(爲什麼?)不需要循環。然後循環陣列對每個初始元素運行查詢(不是最好的想法)。如果成功(如果recordCount?)將值添加到數組,所以現在您有一個11個元素的數組,其中第11個值爲「3」(取決於「everythingTheQueryFoundWithParentIdOfI」的選定列),因此您期望循環現在迭代11次而不是10(無論如何你會立即查看數值)?我認爲你的邏輯可能在這裏有缺陷。 –
Travis
2012-08-14 10:39:55