如何在单个表的MySQL中选择叶子的根

17 浏览
0 Comments

如何在单个表的MySQL中选择叶子的根

我有一个像这样的表格:

id , parent_id , name , leaf

1 , 0 ,parent 1 , 0

2 , 0 ,parent 2 , 0

3 , 1 ,child 1 , 0

4 , 3 ,child 2 , 1

5 , 2 ,child 3 , 0

6 , 5 ,child 4 , 1

7 , 0 ,child 5 , 1

我想选择叶子节点及其根节点的名称,而不是父节点的名称,结果如下:

id  , name     , root_name 
4   ,  child 2  , parent 1
6   ,  child 4  , parent 2
7   ,  child 5  , null

可能有多个级别。请问如何在MySQL中使用存储过程来实现?

0
0 Comments

在MySQL中选择单个表的叶子节点的根节点是一个常见问题。这个问题的原因是,数据库的设计可能没有按照规范进行规范化。解决这个问题的方法是重新设计数据库表结构,将节点和节点关系分开存储在两个表中。

首先,我们需要创建两个表:一个是节点表(nodes),另一个是节点关系表(node_to_parent)。节点表存储节点的信息,包括id和name字段。节点关系表存储节点之间的关系,包括id、node_id和parent_id字段。

下面是表的结构示例:

nodes (
    id,
    name
)
node_to_parent (
    id,
    node_id,
    parent_id
)

有了这两个表,我们可以使用JOIN操作来查询叶子节点的根节点。下面是一个示例查询语句:

SELECT n.name, np.parent_id 
FROM nodes n
JOIN node_to_parent np ON np.node_id = n.id;

这样,我们就可以通过JOIN操作来获取所需的结果。

如果想要使用存储过程来选择叶子节点的根节点,可以将上面的查询语句封装在一个存储过程中。具体实现方法如下:

DELIMITER //
CREATE PROCEDURE select_root_of_leaves()
BEGIN
    SELECT n.name, np.parent_id 
    FROM nodes n
    JOIN node_to_parent np ON np.node_id = n.id;
END //
DELIMITER ;

通过创建上述存储过程,我们就可以通过调用该存储过程来选择叶子节点的根节点。

总结起来,解决在MySQL中选择单个表的叶子节点的根节点的问题,首先需要将节点和节点关系分开存储在两个表中。然后,通过JOIN操作来查询叶子节点的根节点。如果需要使用存储过程来选择根节点,可以将查询语句封装在一个存储过程中。这样,我们就可以方便地选择叶子节点的根节点。

0
0 Comments

如何在单表MySQL中选择叶子节点的根节点?

有时候我们需要在一个单表的MySQL数据库中选择叶子节点的根节点。以下是一种获取所需输出的方法:

select t.id, t.name, m.root_name 
from (select id,parent_id,name,leaf 
      from urtable 
      where leaf=1) t 
join urtable m on (t.parent_id=m.parent_id and t.id=m.id)

这段代码的作用是,首先从表urtable中选择满足条件leaf=1的叶子节点的id、parent_id和name,并将结果命名为t。然后,通过连接urtable表的parent_id和id字段,将t表与m表进行连接,并选择满足条件t.parent_id=m.parent_id和t.id=m.id的记录。最后,从结果中选择id、name和root_name字段。

这种方法的原因是,我们需要在一个单表中选择叶子节点的根节点,而叶子节点和根节点的关系是通过parent_id字段来确定的。通过使用子查询和连接操作,我们可以找到满足条件的叶子节点和对应的根节点,并将它们的id、name和root_name字段输出。

总结起来,以上提供的代码段是解决在单表MySQL中选择叶子节点的根节点的一种方法。通过使用子查询和连接操作,我们可以从表urtable中选择满足条件的叶子节点和对应的根节点,并将它们的id、name和root_name字段输出。

0