簡體   English   中英

在層次表結構中將父節點連接到子節點

[英]Join parent to child node in hierarchical table structure

我有以下用於捕獲樹節點的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以便能夠選擇兩列?

我已經查看了很多有關嘗試左聯接的資源,但無濟於事。 由於需要在子查詢中使用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           

嘗試使用兩個無效的子選擇

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;

在邏輯上似乎是正確的。 抱歉,無法測試。 在這種情況下,如果您確實經常使用此功能,則應重構並設計具有更好定義的父子鏈接的表

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM