mysql - 如何根据节点级别查找父级

标签 mysql sql mariadb mariadb-10.3

我有表 tbl_budget,其中包含 id、budget_code 和 level 列。级别告诉层次结构 current table view

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

此查询确实可以找到一级 parent ,但之后就不行了

选择 tb1.id ,(从 tbl_budget 中选择 buget_code,其中 level = tb1.level-1 LIMIT 0,1)作为 tbl_budget tb1 的父级

最佳答案

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

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

结果:

| 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():

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,那么您甚至不需要连接,因为父级代码是子级代码的一部分,您只需提取它:

select c.*,
  substring_index(c.budget_code, '-', c.level - 1) as parent
from tbl_budget c

关于mysql - 如何根据节点级别查找父级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57124987/

相关文章:

mysql - MariaDB/MySQL 从选择查询插入表,但重复键使用选择查询中的数据

mysql - 错误 1241 (21000) : Operand should contain 1 column(s) when executing query

php - 在 Yii2 查询中结合 GROUP_CONCAT DISTINCT 和 COUNT

mysql - org.apache.commons.dbcp.DelegatingPreparedStatement.setNString(ILjava/lang/String;)V

SQL - 按百分比/合并排名对值进行分组

sql - SELECTING 数据与 CASE 语句问题

sql - Postgres 动态转换特定列

mysql - 为什么 Table Import 显示错误 1366,Data looks good

php - 简单查询耗时较长(~15 秒)

mysql - 寻找从不存在的数据中删除片段的方法