2017-05-28 98 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这只是一个想法,我相信你绝对可以在它之上构建更优雅的解决方案。