2015-10-14 59 views
0

的所有子類別我有以下字段:從給定的類別ID下垂遞歸選擇一個類別

node_id (int, AI) 
category_id, (int) 
parent_node_id (int) 

如何可以選擇所有節點(或類別,如果你願意的話)。而「下垂」是指所有遞歸存儲的節點。

例子:

Category node parent 
     1  1 none 
     2  2 none 
     3  3 none 

     4  4  1 
     5  5  4 
     6  6  5 

預期選擇的輸出:

Category node parent 
     1  1 none 
     4  4  1 
     5  5  4 
     6  6  5 
+1

我收集不到足夠的信息來了解您要做什麼。你試過什麼了? – dan08

+0

Define'none'.. – Strawberry

+0

@ dan08我試圖選擇給定類別的所有孩子。 – alexandernst

回答

0

假設表被稱爲categories

select 
    children.category_id as category, 
    children.node_id as node, 
    parent.node_id as parent_node_id 
from categories parent 
join categories children 
on parent.node_id = children.parent_id; 

這應該讓你的地方。

+0

但是,這只是列出了一個遞歸級別的節點,對吧?我認爲OP希望解決方案能夠工作,而不管嵌套級別如何。 – mabi

+0

瑪比是正確的,這隻列出1個級別。 – alexandernst

+0

我已經upvoted @喬納森的答案,看起來在這種情況下它可能會更有幫助。這不是一個簡單的查詢,但只用'select'就不可能。 –

1

正是我不知道你在找什麼,但根據我的假設。

DECLARE @Table1 TABLE 
    (node_id varchar(9), category_id varchar(5), parent_node_id varchar(11)) 
; 

INSERT INTO @Table1 
    (node_id, category_id, parent_node_id) 
VALUES 
    ('Category1', 'node1', 'parentnone.'), 
    ('Category2', 'node2', 'parentnone.'), 
    ('Category3', 'node3', 'parentnone.'), 
    ('Category4', 'node4', 'parent1.'), 
    ('Category5', 'node5', 'parent4.'), 
    ('Category6', 'node6', 'parent5.') 
; 
select node_id, category_id, parent_node_id from (
select node_id, category_id, parent_node_id,Row_number()OVER(PARTITION BY parent_node_id ORDER BY node_id desc)RN from @Table1 
GROUP BY node_id, category_id, parent_node_id 
)T 
WHERE T.RN = 1 
--ORDER BY cat desc 
ORDER BY RIGHT(category_id,1) 
+0

我不確定MySQL中是否存在'OVER'。 – alexandernst

1

您可以創建一個將返回該類別是否在任何級別的類別你感興趣的子功能。

CREATE FUNCTION `is_child_of`(id INT, related_to_id INT) RETURNS int(11) 
BEGIN 
    DECLARE `exists` BOOL; 
    /* to avoid infinite loop */ 
    SELECT EXISTS(SELECT `parent_id` FROM `category` WHERE `category_id` = id) INTO `exists`; 
    IF `exists` IS FALSE THEN 
     RETURN 0; 
    END IF; 

    WHILE id IS NOT NULL DO 
     IF id = related_to_id THEN 
      RETURN 1; 
     END IF; 

     SELECT `parent_id` INTO id FROM `category` WHERE `category_id` = id; 
    END WHILE; 
    RETURN 0; 
END 

然後,只需選擇它的結果關於你想鑽取的類別。

例如用於與ID的類別 - 1

SELECT * FROM `category` WHERE `is_child_of`(category_id, 1); 

我承認它是遠遠有效的。處理關係數據庫中的層次結構時很難高效。