3

URLに が含まれる e コマース サイトを作成しています。category_idこれに基づいて、category_idすべての子と孫 (見つかった場合) を照会するので、それに関連する製品のみを表示できますcategory_id。このクエリは、親の数を気にしないため、非常に優れています。親が見つからなくなるまで、すべての親を検索します。

私が抱えている問題は、クエリが親と祖父母 (見つかった場合) のみを取得することですが、このクエリが見つかった場合にすべての子行または孫を取得する方法がわかりません。このクエリはhereから引っ張ってきたので、クエリを書いていませんでした。正しい変更を行うのは難しいです...昨日一日中試しました。

編集 このクエリは、関連するすべての子と孫を取得するわけではありません (見つかった場合)。すべての子と孫が必要な場所 (見つかった場合)。

編集これが私 のデータが見つかるSQLフィドルです。

SELECT T2.category_id, T2.category_name 
FROM (SELECT @r AS _id, (SELECT @r := parent 
FROM categories 
WHERE category_id = _id) AS parent 
FROM (SELECT @r := 182)vars, categories h 
WHERE @r <> 0) T1 
JOIN categories T2 
ON T1._id = T2.category_id 
ORDER BY category_id ASC

これが私のテーブルスキーマです:

category_id | category_name | parent

4

2 に答える 2

1

これを行う別の方法がありますが、2 つ目の階層テーブルが必要です。

追加のテーブルには、次のように、親と方向の関係ごとに 1 つの行が含まれます。

category_id category_name parent
   1           cat1          1
   2           cat2          1
   3           cat3          1
   4           cat4          2
   5           cat5          3
   6           cat6          5

category_id ancestor
   1           1
   2           1
   3           1
   4           1
   4           2
   5           1
   5           3
   6           1
   6           3
   6           5

このテーブルは、コードまたはトリガーによって管理できます。階層全体の選択が簡単で非常に高速になりますが、メンテナンス (追加/削除) のオーバーヘッドがいくらか追加されるため、長期的なコストとオーバーヘッドを考慮する必要があります。

于 2013-01-28T10:01:30.967 に答える
0

@rambocoderが示すように、可能な最大深度が事前にわかっている場合は…</p>

SELECT
    p.`category_id`,p.`category_name` AS 'parent',
    c.`category_name` AS 'child',
    gc.`category_name` AS 'grandchild'
FROM (SELECT * FROM `categories` WHERE `parent` IS NULL) p
INNER JOIN `categories` c
ON c.`parent`=p.`category_id`
INNER JOIN `categories` gc
ON gc.`category_id`=c.`category_id`
WHERE p.`category_id`=120
ORDER BY c.`category_id`, gc.`category_id`

それ以外の場合、結果が何レベルの深さになるかわからない場合は、ストアド プロシージャを記述する必要があります。

于 2013-01-27T17:32:42.763 に答える