1

私が持っているのは、Oracle に保存されている一連のカテゴリとサブカテゴリです。この関係は 1 つの方法でのみ表されます。各行には、categoryid と、その行の親の categoryid (存在する場合) である parentid があります。親がない場合、parentid は 0 です。つまり:

ツール:カテゴリ ID、1; 親ID、0

材料:カテゴリ ID、2; 親ID、0

ハンマー:カテゴリ ID、3; 親ID、1

爪:カテゴリ ID、4; 親ID、2

別のテーブルにはアイテムがあります。それぞれに一意の ID と関連するカテゴリ ID があります。

短い爪: itemid, 1; カテゴリーID、4

長い爪: itemid, 2; カテゴリーID、4

両面: itemid、3; カテゴリ ID、3

ゴム: itemid、4; カテゴリ ID、3

私はcoldfusionで「ブラウズカテゴリ」のウェブアプリを構築しています。カテゴリを選択すると、結果のテーブルには、選択したカテゴリのすべてのアイテムと、そのカテゴリのサブカテゴリのアイテムが表示されます。つまり、選択したカテゴリ ツールを使用する場合、カテゴリ ID が 1 の項目はありませんが、ツールのサブカテゴリであるカテゴリ ID が 3 の項目が 2 つあるため、これらの項目を表示する必要があります。

「ツール」リンクをクリック >> 両面とゴムハンマーが表示される

私が今抱えている問題は、カテゴリーの範囲がどうなるかを知る方法がないということです. カテゴリ リストは、非常に多様なカテゴリ/サブカテゴリの関係を含む、数百行の長さになる可能性があります。現在、6 レベルの深さのサブカテゴリがあります。

私の質問は、「アイテムのクエリの親 ID を持つカテゴリの場合」という無限のないクエリをどのように構築する必要があるかということです。これが唯一の方法ではありません。選択したカテゴリ ID の親 ID を持つカテゴリをクエリし、前のクエリで見つかったカテゴリの親 ID を持つカテゴリをクエリし、新しい結果でもう一度繰り返し、新しい結果でもう一度繰り返し、クエリの数に指数関数的に追加するたびに 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 に答える