2012-02-27 3 views
0

Мне нужно написать запрос для выполнения поиска, где все результаты сопоставляются с категорией.
В категориях есть подкатегории, и они работают как вложенная модель набора, и каждый из них имеет lft и rgt-столбец.Запись SQL-запроса с вложенными наборами

Если cat2, cat3 и cat4 являются Чайлдс из cat1 то их .lft значения междуcat1.lft и cat1.rgt

все категории сохраняются в CATEGORIES таблице и имеют ID в качестве первичного ключа.

Мне нужна категория ID найти все элементы на таблице ITEMS, которые относятся к этой категории, но также и все элементы, относящиеся к подкатегориям категории.

им запрос ищет будет что-то вроде этого

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), но на запрос я должен работать с их РТГ и LTF значения

Должен ли я использовать подзапросы или, возможно, присоединиться? И как должен быть запрос? У меня действительно нет такого опыта в SQL.

+0

Смотрите это [ вопрос] (http://stackoverflow.com/questions/316267/help-with-writing-a-sql-query-for-nested-sets). –

+1

В таблице элементов хранится элемент category_id элемента (как предполагается в ответе ypercube) или его значение category_lft (как подразумевается в примере запроса, заданном в вопросе)? –

ответ

-1

Для этого вам понадобится рекурсивный SQL.

Сначала найдите все подкатегории, которые имеют данную категорию как родитель, дедушка, дедушка, гранд-паддл, ... (не забудьте включить данную категорию).

Затем присоедините эти подкатегории к категориям в таблице товаров.

Я бы забыл о значениях 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

Вопрос относится к MySQL, а не SQLServer. –

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