2012-02-27 14 views
0

すべての結果がカテゴリと一致する検索を実行するクエリを作成する必要があります。
カテゴリにはサブカテゴリがあり、ネストされたセットモデルとして機能し、それぞれにはlft列とrgt列があります。ネストされたセットを含むSQLクエリを書く

cat2cat3cat4cat1のチャイルズある場合、それら.lft値が

cat1.lftcat1.rgtすべてのカテゴリ CATEGORIESテーブルに格納され IDとして主キーを有するされています。

私はどのカテゴリに属する​​のですかIDITEMSテーブルのすべてのアイテムを見つけますが、そのカテゴリに属する​​テーブルだけでなく、カテゴリのサブカテゴリに属する​​すべてのアイテムも見つかります。

を探してクエリイムは、私が何を意味するか、この

SELECT i.id, i.name 
FROM items AS i, categories AS c 
WHERE i.category_lft BETWEEN c.given_cat_id_lft AND c.given_cat_id_rgt 

ようなものになるだろう、私はカテゴリの主キー(ID)を取得するが、クエリに、私は彼らのRGTとLTF値

で作業する必要があります

サブクエリを使用するか、または結合する必要がありますか? クエリはどのようにすべきですか? 私は本当にSQLでの経験がありません。

+0

は[これを参照してください。質問](http://stackoverflow.com/questions/316267/help-with-writing-a-sql-query-for-nested-sets)。 –

+1

itemsテーブルにアイテムのcategory_id(ypercubeの回答で仮定)またはcategory_lftの値(質問で提供されているサンプルクエリに含意)が格納されていますか? –

答えて

-1

これを解決するには、再帰的なSQLが必要です。

まず、指定されたカテゴリを持つすべてのサブカテゴリを親、祖父母、grandgrandparent、...(特定のカテゴリ自体を含むことを忘れないでください)として見つけます。

次に、これらのサブカテゴリをアイテムテーブルのカテゴリに参加させてください。

私はlftとrghtの値を忘れてしまいます。その仕事をするのは大変な仕事です。 (???仕事BETWEEN同上の値に基づいて、既存のサブカテゴリの間のどこかにサブカテゴリを挿入の結果を想像することができますでしょうか)

0

はこれを試してみてください:

CREATE table #Category(
id  INT NOT NULL, 
name VARCHAR(20) NOT NULL, 
parentid INT NOT NULL 
) 

INSERT INTO #Category (id, name, parentid) VALUES 
(1, 'parts', 1), 
(2, 'processor', 1), 
(3, 'AMD', 2), 
(4, 'Intel', 2), 
(5, 'Hard Disk', 1), 
(6, 'Memory', 1), 
(7, 'DDR1', 6), 
(8, 'DDR2', 6), 
(9, 'DDR3', 6), 
(10, '533Mhz', 7), 
(11, '667Mhz', 8), 
(12, '800Mhz', 8) 

CREATE table #Items(
id  INT NOT NULL, 
name VARCHAR(20) NOT NULL, 
categoryId INT NOT NULL 
) 

INSERT INTO #Items (id, name, categoryId) VALUES 
(1, 'AMD Phenom', 3), 
(2, 'AMD Sempron', 3), 
(3, 'AMD Athlon', 3), 
(4, 'Intel core 2 duo', 4), 
(5, 'Intel core i3', 4), 
(6, 'DDR2 1GB 6667Mhz', 11), 
(7, 'Intel 8080', 4), 
(8, 'Intel 80286', 4), 
(9, 'Intel 80386', 4), 
(10, 'Intel 80486', 4), 
(11, 'Intel Pentuim', 4), 
(12, 'Intel Pentium I', 4) 


DECLARE @TopLevelId INT; -- top level category Id 
SET @TopLevelId = 2; -- top level category = AMD processors 

WITH CTE AS 
(SELECT id, name, parentid, id as Adam, 1 as level 
FROM #Category 
WHERE id = @TopLevelId 
UNION ALL 
SELECT #Category.id, #Category.name, #Category.parentid, CTE.Adam, CTE.level + 1 
FROM #Category 
INNER JOIN CTE ON 
    #Category.parentid = CTE.id 
WHERE #Category.id <> @TopLevelId 
) 
SELECT CTE.id CategoryId, CTE.name as Category, #Items.name as Item 
FROM CTE 
INNER JOIN #Items ON 
    CTE.id = #Items.categoryId 
ORDER BY level, CTE.id 


DROP table #Category 
DROP table #Items 
+0

質問はSQLServerではなくMySQLに関係します。 –

1
SELECT i.id 
     , i.name 
FROM items AS i 
    JOIN categories AS c 
    ON i.category_id = c.id 
    JOIN categories AS myc 
    ON c.category_lft BETWEEN myc.lft AND myc.rgt 
WHERE myc.id = @GivenCategoryID 
関連する問題