谁能指导我如何使用 MySQL Query 动态地为表创建 lft 和 rgt 列(从根目录从左到右解析)?
我的表的结构如下所示:
id----name----parent_id
我想要这样的结构:
name----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 年的书“Smarties 中的树和层次结构”以及Mike Hillyer 的博客文章而流行,该文章至少可以追溯到 2010 年。
嵌套集模型的一个问题是向层次结构中添加节点必须一次一个节点完成,因为插入到树中的每个节点都需要从插入点到树left
的right
右侧重新编号。
left
一位朋友建议我对and使用浮点数而不是整数right
,然后在向树中插入新节点时,您可以在现有数字之间使用小数值。
嵌套集模型的另一个问题是left
andright
值不引用任何其他数据元素。事实上,除了它们与其他节点的left
和right
值的关系之外,没有任何意义。所以没有数据完整性,数据异常很容易破坏你的层次结构。
唯一具有数据完整性的分层模型是您已经拥有的模型——存储parent_id
在每个节点的行中。当每个节点都知道自己的父节点时,就不会存在数据异常,并且不会与任何其他行发生争论或冲突。
该模型称为 Adjecency List 模型的缺点是 MySQL 直到 8.0 版本才支持递归查询。请参阅https://dev.mysql.com/doc/refman/8.0/en/with.html中的示例