在MySQL中动态创建lft和rgt列



有人能指导我如何使用MySQL Query为表动态创建lft和rgt列(在树中从左到右从根解析(吗?

我的表格结构如下:

id----name----parent_id

我想要这样的结构:

name----lft----rgt

您可以自联接表并聚合:

select
t.id
t.name,
min(t1.id) left_id,
max(t1.id) right_id
from mytable t
left join mytable t1 on t1.parent_id = t.id
group by t.id, t.name

这假设每个节点正好有两个子节点。如果某些节点可能只有一个子节点,则可以添加一点逻辑:

select
t.id
t.name,
min(t1.id) left_id,
case when min(t1.id) <> max(t1.id) then max(t1.id) end right_id
from mytable t
left join mytable t1 on t1.parent_id = t.id
group by t.id, t.name

我不喜欢在关系数据库中表示层次数据的嵌套集模型。乔·塞尔科(Joe Celko(2004年出版的《聪明人SQL中的树和层次结构》(Trees and Hierarchies in SQL for Smarties(一书以及迈克·希利尔(Mike Hillyer(的一篇博客文章(至少可以追溯到2010年(让它广受欢迎。

嵌套集模型的一个问题是,向层次结构中添加节点必须一次一个节点,因为插入到树中的每个节点都需要从插入点到树右侧重新编号leftright

一位朋友建议我在leftright中使用浮点数而不是整数,然后在树中插入新节点时,可以只使用现有数字之间的小数。

嵌套集模型的另一个问题是leftright值没有引用任何其他数据元素。事实上,除了它们与其他节点的leftright值的关系之外,没有任何意义。因此,没有数据完整性,数据异常很容易破坏您的层次结构。

唯一具有数据完整性的分层模型是您已经拥有的模型——将parent_id存储在每个节点的行中。当每个节点都知道自己的父节点时,数据异常就不可能存在,也不会与任何其他行发生争论或冲突。

该模型被称为"邻接列表"模型,其缺点是MySQL直到8.0版本才支持递归查询。请参阅中的示例https://dev.mysql.com/doc/refman/8.0/en/with.html

最新更新