我有一个tabel,其中包含一个名为parent的列,该列能够存储父ID,这使得创建我的数据的树形结构成为可能。
在MySQL中,有没有很好的辅助函数来遍历这样的树结构?
例如,如果我的表中有一行,并且我希望能够检索到它上面的所有"parents“。所以获取它的父母的父母ID等等...
发布于 2012-03-26 15:15:49
从这个流行的link复制
CREATE TABLE nested_category (
category_id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20) NOT NULL,
lft INT NOT NULL,
rgt INT NOT NULL
);
INSERT INTO nested_category VALUES(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);
SELECT * FROM nested_category ORDER BY category_id;
+-------------+----------------------+-----+-----+
| 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 |
+-------------+----------------------+-----+-----+您可以使用它来查找节点FLASH中的所有父节点

检索单个路径
使用嵌套的set模型,我们可以检索单个路径,而不需要多个自联接:
SELECT parent.name
FROM nested_category AS node,
nested_category AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
AND node.name = 'FLASH'
ORDER BY node.lft;
+----------------------+
| name |
+----------------------+
| ELECTRONICS |
| PORTABLE ELECTRONICS |
| MP3 PLAYERS |
| FLASH |
+----------------------+这之所以有效,是因为孩子的left将位于父母的left和right之间。
您可以进一步read或搜索修改后的预序树遍历。
发布于 2012-03-26 15:16:44
请阅读这篇"Hierarchical queries in MySQL“文章,深入了解该主题。
但是我仍然想保持简单,创建一个递归的PHP函数。
但在阅读了几篇文章后,我发现考虑这一点的最好方法是Modified Preorder Tree Traversal,,this文章中对此进行了进一步的解释。
https://stackoverflow.com/questions/9867898
复制相似问题