MySQL嵌套集 - 如何查找节点的父节点?

Jak*_*son 11 mysql sql hierarchy nested-sets

我使用以下列运行了mill嵌套集层次结构类型设置:

表名:

myset
Run Code Online (Sandbox Code Playgroud)

列:

id, name, lft, rgt
Run Code Online (Sandbox Code Playgroud)

有没有人知道查询来确定节点的节点?

我读了几个地方,在你的表中有一个parent_id列来跟踪这个很方便,但它似乎是多余的,如果在添加/时查询被错误地执行,它似乎可能与嵌套集不同步移除/移动集合中的任何内容.

Luk*_*sik 20

看看这个问题.它与你的相似.我在那里发布了您可能需要的查询.

SELECT title, (SELECT TOP 1 title 
           FROM tree t2 
           WHERE t2.lft < t1.lft AND t2.rgt > t1.rgt    
           ORDER BY t2.rgt-t1.rgt ASC) AS parent
FROM tree t1
ORDER BY rgt-lft DESC
Run Code Online (Sandbox Code Playgroud)

我希望有你需要的东西.

对于下表:

+-------------+----------------------+-----+-----+
| category_id | name                 | lft | rgt |
+-------------+----------------------+-----+-----+
|           1 | ELECTRONICS          |   1 |  20 |
|           2 | TELEVISIONS          |   2 |   9 |
|           3 | TUBE                 |   3 |   4 |
|           4 | LCD                  |   5 |   6 |
|           5 | PLASMA               |   7 |   8 |
|           6 | PORTABLE ELECTRONICS |  10 |  19 |
|           7 | MP3 PLAYERS          |  11 |  14 |
|           8 | FLASH                |  12 |  13 |
|           9 | CD PLAYERS           |  15 |  16 |
|          10 | 2 WAY RADIOS         |  17 |  18 |
Run Code Online (Sandbox Code Playgroud)

它产生输出:

title                | parent
----------------------------------------------
ELECTRONICS          | NULL
PORTABLE ELECTRONICS | ELECTRONICS
TELEVISIONS          | ELECTRONICS
MP3 PLAYERS          | PORTABLE ELECTRONICS
FLASH                | MP3 PLAYERS
CD PLAYERS           | PORTABLE ELECTRONICS
2 WAY RADIOS         | PORTABLE ELECTRONICS
TUBE                 | TELEVISIONS
LCD                  | TELEVISIONS
PLASMA               | TELEVISIONS
Run Code Online (Sandbox Code Playgroud)


小智 17

TOP是一个MSSQL命令,使用LIMIT for MySQL:

SELECT title, (SELECT title 
       FROM tree t2 
       WHERE t2.lft < t1.lft AND t2.rgt > t1.rgt    
       ORDER BY t2.rgt-t1.rgt ASC
       LIMIT 1) 
AS parent FROM tree t1 
ORDER BY (rgt-lft) DESC
Run Code Online (Sandbox Code Playgroud)

应该做的伎俩..