当前位置: 首页 > 面试题库 >

顺序sql树层次结构

姜运珧
2023-03-14
问题内容

像这样对表格进行排序的最佳方法是什么:

CREATE TABLE category(
    id INT(10),
    parent_id INT(10),
    name VARCHAR(50)
);

INSERT INTO category (id, parent_id, name) VALUES
(1, 0, 'pizza'),        --node 1
(2, 0, 'burger'),       --node 2
(3, 0, 'coffee'),       --node 3
(4, 1, 'piperoni'),     --node 1.1
(5, 1, 'cheese'),       --node 1.2
(6, 1, 'vegetariana'),  --node 1.3
(7, 5, 'extra cheese'); --node 1.2.1

要通过分级排序,它 的ID名字
“比萨饼” //节点1
“piperoni” //节点1.1
“奶酪” //节点1.2
“额外的奶酪” //节点1.2.1
“vegetariana” //节点1.3
“汉堡” //节点2
‘咖啡’//节点3

编辑: 名称 末尾的数字是为了更好地可视化strucutre,而不是用于排序。

编辑2: 正如多次提到的… name“奶酪 1.2
末尾的数字仅用于可视化目的,而不用于排序。我以评论为由动了他们,太多人感到困惑,抱歉。


问题答案:

通过添加路径列和触发器,可以很容易地做到这一点。

首先添加一个varchar列,其中将包含从根到节点的路径:

ALTER TABLE category ADD path VARCHAR(50) NULL;

然后添加一个触发器来计算插入时的路径:

(只需将新ID与父级路径合并在一起)

CREATE TRIGGER set_path BEFORE INSERT ON category
  FOR EACH ROW SET NEW.path = 
  CONCAT(IFNULL((select path from category where id = NEW.parent_id), '0'), '.', New.id);

然后只需选择按路径排序:

SELECT name, path FROM category ORDER BY path;

结果:

pizza         0.1
piperoni      0.1.4
cheese        0.1.5
extra cheese  0.1.5.7
vegetariana   0.1.6
burger        0.2
coffee        0.3

见小提琴。

这样,维护成本也最小。插入时路径字段是隐藏的,并且是通过触发器计算的。删除节点没有开销,因为该节点的所有子节点也都被删除了。唯一的问题是在更新节点的parent_id时;好吧,不要那样做!:)



 类似资料:
  • 我想对二叉树执行级别顺序遍历。因此,对于给定的树,说: 产出将是: 我知道我可以使用某种队列,但在C中递归地实现这一点的算法是什么?感谢您的帮助。

  • 我已经为我的二叉搜索树做了4次不同的遍历。我被困在最后一个,这是水平顺序遍历,我不能得到,似乎找到如何做它正确。 主要的问题是我不知道如何一次只搜索一个层次,我只知道如何搜索整个左或整个右子树。

  • 我在我的应用程序中使用MVVM模式。我有以下(简化版)VM类: 因此,一个Module2601_VM包含几个属性,以及Module2610_VM和ComPort_VM对象的列表。 我有一个MainModule_VM类中Module2601_VM对象的列表。 我想将这个Module2601集合及其子项绑定到树状视图中,并使用以下层次结构: 网关: 网关#0 COM#1 我的问题是,我的层次结构正常,

  • 问题内容: 我有一个表,它表示类别层次结构,层次结构顶部的元素的父ID为0。在CatID列中有超过54K个唯一ID。每个ID可以是另一个ID的父对象。类别深入8个级别。该表如下所示: 这就是我想要实现的结果: 我怎样才能做到这一点?我是否需要某种循环才能遍历所有ID? 有人可以帮忙吗? 问题答案: 这里是:

  • 问题内容: 该表表示类别层次结构,层次结构顶部的元素的父ID为NULL。该表如下所示: 我正在尝试做的是建立一个SQL查询,这将使我返回: 任何给定[categoryId]的[categoryId],[categoryName]链。它应该循环并获取每一行,直到到达具有parentId == NULL的行为止。 如上面的示例示例234-> 91-> 35-> 20-> 1-> NULL(STOP)

  • 问题内容: 假设这张table 我将如何编写简单的CTE(或其他类型的查询),以在任何级别返回它们的父/子关系,但将所有子项的排序顺序保持在父项之下。 基本上,这将是一个简单的树视图,其中的子项目按特定的排序顺序进行排序。 SQL Server 2008是数据库 更新:可以有无限个父级/子级-我尝试了其他堆栈问题/答案中的一些示例,但没有一个在子级中包含排序顺序。 示例结果应为: 等等。 希望这是