Mysql,树结构的函数

Posted

技术标签:

【中文标题】Mysql,树结构的函数【英文标题】:Mysql, functions for tree-structure 【发布时间】:2012-03-26 07:01:32 【问题描述】:

我有一个表,其中包含一个名为 parent 的列,它能够存储父 ID。 这使得创建我的数据的树结构成为可能。

mysql 中是否有任何好的帮助函数可以遍历这种树结构?

例如,如果我的表中有一行,并且我希望能够检索其上方的所有“父母”。所以得到它的父母的父母ID等等......

【问题讨论】:

Is it possible to query a tree structure table in MySQL in a single query, to any depth?的可能重复 This thread 有很多有用的链接。 @Konerak,这是不同的 - 这个问题是询问如何让所有后代达到任何深度。查看搜索结果,我看到很多关于树和 sql 的类似问题,但没有人问这个特定的问题——如何获得所有父母。 @BenLee 然而,答案使用了我重复提出的问题答案中的链接中的信息......问题确实有点不同,但答案也涵盖了这个问题。 【参考方案1】:

从这个受欢迎的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 中查找所有父节点:

检索单个路径

使用嵌套集合模型,我们可以检索单个路径,而无需 有多个自联接:

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 将介于其父母的 leftright 之间。 您可以进一步read 或搜索modified preorder tree traversal

【讨论】:

treeset 结构使用起来很舒服,这也是我的建议【参考方案2】:

请阅读这篇“Hierarchical queries in MySQL”文章,深入了解该主题。

但我仍然想保持简单,而是创建一个递归 php 函数。

但看了几篇文章后,我发现最好的方法是Modified Preorder Tree Traversal,在this文章中有进一步的解释。

【讨论】:

以上是关于Mysql,树结构的函数的主要内容,如果未能解决你的问题,请参考以下文章

MySQL B+树结构解析以及深度计算

MySQL 树形索引结构 B树 B+树

MySQL Index--平衡树结构

MySQL底层为什么要选用B+树作为索引的数据结构呢?

MySQL B+树以及深度计算

MySQL索引学习