首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据节点级别查找父节点

如何根据节点级别查找父节点
EN

Stack Overflow用户
提问于 2019-07-20 21:02:58
回答 2查看 63关注 0票数 0

我有一个包含id、budget_code和level列的表tbl_budget。Level告诉层次结构current table view

我想根据级别查找每个预算代码的父代

此查询确实可以找到第一级父级,但在那之后就不会了

选择tb1.id (Select buget_code From tbl_budget where level = tb1.level-1 \f25 LIMIT 0,1)作为tbl_budget tb1的父项

EN

回答 2

Stack Overflow用户

发布于 2019-07-20 21:37:34

如果我正确理解了您的层次结构,那么您可以在ON子句中使用LIKE来比较budget_codes:

代码语言:javascript
复制
select c.*, p.id as parent_id, p.budget_code as parent_budget_code
from tbl_budget c
left join tbl_budget p 
  on  p.level = c.level - 1
  and c.budget_code like concat(p.budget_code, '%')
order by c.id

结果:

代码语言:javascript
复制
| id  | budget_code | level | parent_id | parent_budget_code |
| --- | ----------- | ----- | --------- | ------------------ |
| 1   | 001         | 1     |           |                    |
| 2   | 001-1       | 2     | 1         | 001                |
| 3   | 001-2       | 2     | 1         | 001                |
| 4   | 001-2-1     | 3     | 3         | 001-2              |
| 5   | 002         | 1     |           |                    |
| 6   | 002-1       | 2     | 5         | 002                |
| 7   | 002-2       | 2     | 5         | 002                |

db-fiddle

另一种方法是使用SUBSTRING_INDEX()

代码语言:javascript
复制
select c.*, p.id as parent_id, p.budget_code as parent_budget_code
from tbl_budget c
left join tbl_budget p 
  on p.budget_code = substring_index(c.budget_code, '-', c.level - 1)
order by c.id

如果您只需要父代码的budget_code,那么您甚至不需要join,因为父代码是子代码的一部分,您只需要提取它:

代码语言:javascript
复制
select c.*,
  substring_index(c.budget_code, '-', c.level - 1) as parent
from tbl_budget c
票数 1
EN

Stack Overflow用户

发布于 2019-07-20 21:41:06

签出以下查询:

模式(MySQL v5.7)

代码语言:javascript
复制
create table tbl_budget (
  `id` INT ,
  `budget_code` VARCHAR(255),
  `level` INT
);

INSERT INTO `tbl_budget` VALUES
(1, '001', 1),
(2, '001-1', 2),
(3, '001-2', 2),
(4, '001-2-1', 3),
(5, '002', 1),
(6, '002-1', 2),
(7, '002-2', 2);

查询

代码语言:javascript
复制
SELECT 
  @count_dash := LENGTH(tb1.budget_code) - LENGTH(REPLACE(tb1.budget_code, '-', '')) as count_dash,  
  tb1.id, 
  tb1.budget_code, 
  SUBSTRING_INDEX(tb1.budget_code, '-', -1) as child_part,
  SUBSTRING_INDEX(tb1.budget_code, '-', @count_dash) as parent_part,
  (
    SELECT id 
    FROM tbl_budget 
    WHERE 
      `level` = tb1.level-1 AND parent_part = `budget_code`
    LIMIT 1
  ) as parent_id
FROM tbl_budget tb1;
代码语言:javascript
复制
| count_dash | child_part | parent_part | parent_id | id  | budget_code |
| ---------- | ---------- | ----------- | --------- | --- | ----------- |
| 0          | 001        |             |           | 1   | 001         |
| 1          | 1          | 001         | 1         | 2   | 001-1       |
| 1          | 2          | 001         | 1         | 3   | 001-2       |
| 2          | 1          | 001-2       | 3         | 4   | 001-2-1     |
| 0          | 002        |             |           | 5   | 002         |
| 1          | 1          | 002         | 5         | 6   | 002-1       |
| 1          | 2          | 002         | 5         | 7   | 002-2       |

解释:

我假设您的数据中存在命名一致性。问题是,要获取条目的父项,您不仅需要level,还需要部分代码进行匹配

步骤1:

下面计算budget_code中'-‘的个数

代码语言:javascript
复制
@count_dash := LENGTH(tb1.budget_code) - LENGTH(REPLACE(tb1.budget_code, '-', ''))

第2步:

现在,我们将budget_code除以'-‘,然后返回:

  • 最后一部分(-1)是子代码
  • 所有部分,但不是最后一部分,这是父代码

这是使用SUBSTRING_INDEX完成的,它将给定的字符串拆分为该字符,并返回请求的部分的数量

第3步:

因为每个代码都有一个父代码,所以我们连接并返回父代码的id。为了找到正确的答案,我们需要满足以下条件:

  1. 父级等于我们的1级
  2. 父级预算代码等于我们的父级代码部分

View on DB Fiddle

方法2

上面展示了如何获取父代码(即使没有join)。但是,您的查询可以简化为以下内容:

代码语言:javascript
复制
SELECT 
  tb1.id, 
  tb1.budget_code, 
  (
    SELECT id
    FROM tbl_budget 
    WHERE 
      `level` = tb1.level-1 
       AND tb1.budget_code LIKE CONCAT(budget_code, '%')
    LIMIT 1
  ) as parent_id
FROM tbl_budget tb1;

在这种情况下,我们说的是:找到一个条目,比当前条目高一级,并且其budget_code包含在当前条目中。请注意,您可以将parent_id更改为parent_code,但是,如果需要代码,我将避免连接

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57124987

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档