2012-02-27 6 views
0

모든 결과가 카테고리와 일치하는 검색을 수행하는 쿼리를 작성해야합니다.
범주에는 하위 범주가 있으며 중첩 된 집합 모델로 작동하며 각각에는 lft 및 rgt 열이 있습니다. cat2, cat3cat4cat1의 차일 그들의 .lft 값은 모든 카테고리가 CATEGORIES 테이블에 저장된 기본 키로서 ID을 갖는다 중첩 세트가있는 SQL 쿼리 작성

cat1.lft 사이 cat1.rgt되어있다

경우.

내가 무엇이 필요합니다 카테고리 IDITEMS 테이블에있는 모든 항목을 찾을뿐만 아니라 카테고리 하위 범주에 속하는 모든 항목을 찾습니다.

을 찾고 쿼리 메신저 내 말 것은 내가 카테고리 기본 키 (ID)를 얻을 수있다이

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 

같은 것입니다 만 쿼리에 나는 그들의 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이 필요합니다.

먼저 주어진 카테고리가 parent, grandparent, grandgrandparent ... 인 모든 하위 카테고리를 찾습니다 (주어진 카테고리 자체를 포함하는 것을 잊지 마십시오).

그런 다음 Items 테이블의 범주가있는이 하위 범주에 가입하십시오.

저는 lft와 rght 값을 잊어 버릴 것입니다. 그 일을하는 것은 지옥 일 것입니다. (??? 일 사이 이드의의의 값을 기준으로 기존 하위 범주 사이의 어딘가에 하위 범주를 삽입의 결과를 상상할 수 얼마나)

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