在层次表结构中将父节点连接到子节点

时间:2017-09-13 21:30:00

标签: mysql sql hierarchical-data

我有以下SQL用于获取树节点及其父节点:

SELECT 
        c.id
    ,   c.tag
    ,   (
            SELECT 
                    s.id
            FROM treeTable s 
            WHERE s.lft < c.lft AND s.rgt > c.rgt
            ORDER BY s.rgt - c.rgt ASC
            LIMIT 1
        ) AS parent
FROM treeTable c;

问题是我在表格中也需要s.tag,但是我不能从子查询中选择两列。我怎样才能重构这个SQL以便能够选择两列?

我已经看过很多关于可能尝试LEFT JOIN的资源,但却找不到任何工作。由于需要在子查询中使用ORDER BY和LIMIT,我无法想到一个简单的分组操作

编辑:表的结构如下:

Field     Type              Collation          Null    Key     Default  Extra           Privileges                       Comment  
--------  ----------------  -----------------  ------  ------  -------  --------------  -------------------------------  ---------
id        int(10)           (NULL)             NO      PRI     (NULL)   auto_increment  select,insert,update,references                    
tag       varchar(255)      latin1_swedish_ci  NO              (NULL)                   select,insert,update,references           
lft       int(11)           (NULL)             NO      MUL     (NULL)                   select,insert,update,references           
rgt       int(11)           (NULL)             NO      MUL     (NULL)                   select,insert,update,references           

1 个答案:

答案 0 :(得分:0)

尝试使用两个低效的子选择

SELECT 
c.id,
c.tag,
(
    SELECT 
        s.id
    FROM treeTable s 
    WHERE s.lft < c.lft AND s.rgt > c.rgt
    ORDER BY s.rgt - c.rgt ASC
    LIMIT 1
) AS parent, 
(
    SELECT 
        s.tag
    FROM treeTable s 
    WHERE s.lft < c.lft AND s.rgt > c.rgt
    ORDER BY s.rgt - c.rgt ASC
    LIMIT 1
) AS parent_tag
FROM treeTable c;

这似乎在逻辑上是正确的。不能测试它对不起。在这种情况下,如果你真的经常使用它,你应该重新设计和设计一个具有更好定义的父子链接的表