我有一个包含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的父项
发布于 2019-07-20 21:37:34
如果我正确理解了您的层次结构,那么您可以在ON子句中使用LIKE来比较budget_codes:
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 |另一种方法是使用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,那么您甚至不需要join,因为父代码是子代码的一部分,您只需要提取它:
select c.*,
substring_index(c.budget_code, '-', c.level - 1) as parent
from tbl_budget c发布于 2019-07-20 21:41:06
签出以下查询:
模式(MySQL v5.7)
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);查询
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;| 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中'-‘的个数
@count_dash := LENGTH(tb1.budget_code) - LENGTH(REPLACE(tb1.budget_code, '-', ''))第2步:
现在,我们将budget_code除以'-‘,然后返回:
-1)是子代码这是使用SUBSTRING_INDEX完成的,它将给定的字符串拆分为该字符,并返回请求的部分的数量
第3步:
因为每个代码都有一个父代码,所以我们连接并返回父代码的id。为了找到正确的答案,我们需要满足以下条件:
方法2
上面展示了如何获取父代码(即使没有join)。但是,您的查询可以简化为以下内容:
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,但是,如果需要代码,我将避免连接
https://stackoverflow.com/questions/57124987
复制相似问题