2017-05-28 109 views
2

我有一個MySQL表是這樣的:選擇樹路徑

| CategoryId |   Name | CategoryParentId | 
|------------|---------------|------------------| 
|   0 | Tech Support |   (null) | 
|   1 | Configuration |    0 | 
|   2 |  Questions |    1 | 
|   3 |   Sales |   (null) | 
|   4 |  Questions |    3 | 
|   5 |   Other |   (null) | 

這是我想要的輸出當查詢的ID 2(例如):

技術支持/配置/問題

我該如何做到這一點,而無需做多個連接?

Fiddle

編輯:不知道,如果是這樣做的最佳方式,但我通過創建一個函數來解決:

DELIMITER $$ 

CREATE FUNCTION get_full_tree (CategoryId int) RETURNS VARCHAR(200) 

BEGIN 
SET @CategoryParentId = (SELECT CategoryParentId FROM category c WHERE c.CategoryId = CategoryId); 
SET @Tree = (SELECT Name FROM category c WHERE c.CategoryId = CategoryId); 
WHILE (@CategoryParentId IS NOT NULL) DO 
    SET @ParentName = (SELECT Name FROM category c WHERE c.CategoryId = @CategoryParentId); 
    SET @Tree = CONCAT(@ParentName, '/', @Tree); 
    SET @CategoryParentId = (SELECT CategoryParentId FROM category c WHERE c.CategoryId = @CategoryParentId); 
END WHILE; 
RETURN @Tree; 
END $$ 
DELIMITER ; 

我現在可以做這個查詢:

SELECT CategoryId, get_full_tree(CategoryId) FROM category 
+0

不知道是否可以在一行中完成。您可以從MYTABLE中執行SELECT NAME CATEGORYID <= p_CategoryId;並將結果寫入臨時表,然後使用臨時表上的WHILE循環來連接名稱。或者你可以使用遊標來連接名字。 –

回答

1

您可以創建一個新表格,我們將其命名爲hierarchy(可能是一個更好的名稱),我們將存儲一個類別的所有祖先。

CREATE TABLE `hierarchy` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `parent` int(11) NOT NULL, 
    `child` int(11) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB; 

例如,在這種情況下爲QuestionsID-> 2我們將有以下條目:

id parent  child 
====================    
6  0   2 
7  1   2 
8  2   2 

對於整個實例表中的內容將是:

id  parent  child 
=========================== 
1   0   0 
2   3   3 
3   5   5 
4   0   1 
5   1   1 
6   0   2 
7   1   2 
8   2   2 
9   3   4 
10   4   4 

現在,無論何時您想要檢索節點的全部祖先,請執行以下查詢:

select name from category where id in (select parent from hierarchy where child = 2 order by id ASC) 

上面的查詢將返回所有祖先名稱爲Questions(ID-> 2),即

name 
================== 
Tech Support 
Configuration 
Questions 

爲了完整抖動下面是category

id    Name 
============================ 
0    Tech Support 
1    Configuration 
2    Questions 
3    Sales 
4    Questions 
5    Other 

內容NB這只是一個想法,我相信你絕對可以在它之上構建更優雅的解決方案。