节点 (c) 的每个祖先都有一个较小的 left 和较大的 right 值。而直接父级 (p) 是该集合(祖先)中具有最大 left 值的那个。
例如
CREATE TABLE nested (
id int AUTO_INCREMENT,
name varchar(16),
parentid int DEFAULT 0,
lft int(11),
rgt int(11),
PRIMARY KEY (id)
)
INSERT INTO
nested (name, parentid, lft, rgt)
VALUES
('1' ,0,1,20),
('1.1' ,0,2,9),
('1.1.1' ,0,3,4),
('1.1.2' ,0,5,6),
('1.1.3' ,0,7,8),
('1.2' ,0,10,19),
('1.2.1' ,0,11,14),
('1.2.1.1',0,12,13),
('1.2.2' ,0,15,16),
('1.2.3' ,0,17,18)
SELECT
p.id as pid, p.name as pname,
c.id as cid, c.name as cname
FROM
nested as c
LEFT JOIN
nested as p
ON
p.lft=(
SELECT
MAX(lft)
FROM
nested AS l
WHERE
c.lft > l.lft
AND c.lft < l.rgt
)
返回
pid pname cid cname
NULL NULL 1 1
1 1 2 1.1
2 1.1 3 1.1.1
2 1.1 4 1.1.2
2 1.1 5 1.1.3
1 1 6 1.2
6 1.2 7 1.2.1
7 1.2.1 8 1.2.1.1
6 1.2 9 1.2.2
6 1.2 10 1.2.3