MySQL树状结构通常用于表示具有层次关系的数据,如组织结构、文件系统等。常见的树状结构实现方法有邻接列表模型(Adjacency List Model)、路径枚举模型(Path Enumeration Model)、嵌套集模型(Nested Set Model)和闭包表模型(Closure Table Model)。
CREATE TABLE tree (
id INT PRIMARY KEY,
name VARCHAR(255),
parent_id INT,
FOREIGN KEY (parent_id) REFERENCES tree(id)
);
CREATE TABLE tree (
id INT PRIMARY KEY,
name VARCHAR(255),
path VARCHAR(255)
);
CREATE TABLE tree (
id INT PRIMARY KEY,
name VARCHAR(255),
lft INT,
rgt INT
);
CREATE TABLE tree_nodes (
id INT PRIMARY KEY,
name VARCHAR(255)
);
CREATE TABLE tree_paths (
ancestor_id INT,
descendant_id INT,
depth INT,
PRIMARY KEY (ancestor_id, descendant_id),
FOREIGN KEY (ancestor_id) REFERENCES tree_nodes(id),
FOREIGN KEY (descendant_id) REFERENCES tree_nodes(id)
);
问题:如何查询某个节点的所有子节点?
解决方法:
SELECT * FROM tree WHERE parent_id = ?;
SELECT * FROM tree WHERE path LIKE ? || '%';
SELECT * FROM tree WHERE lft > ? AND rgt < ?;
SELECT tn.*
FROM tree_nodes tn
JOIN tree_paths tp ON tn.id = tp.descendant_id
WHERE tp.ancestor_id = ?;
问题:如何查询某个节点的所有祖先节点?
解决方法:
WITH RECURSIVE ancestors AS (
SELECT * FROM tree WHERE id = ?
UNION ALL
SELECT t.* FROM tree t JOIN ancestors a ON t.id = a.parent_id
)
SELECT * FROM ancestors;
SELECT * FROM tree WHERE ? LIKE path || '%';
SELECT * FROM tree WHERE lft < ? AND rgt > ?;
SELECT tn.*
FROM tree_nodes tn
JOIN tree_paths tp ON tn.id = tp.ancestor_id
WHERE tp.descendant_id = ?;
希望这些信息对你有所帮助!如果有更多具体问题,欢迎继续提问。
领取专属 10元无门槛券
手把手带您无忧上云