我有tbl_budget表,其中包含ID,预算代码和级别列。等级告诉等级 current table view
我想根据预算级别查找每个预算代码的上级
此查询确实发现一级父母很好,但之后没有
从tbl_budget tb1中选择父级(从tbl_budget中选择buget_code,其中level = tb1.level-1 LIMIT 0,1)作为父级
答案 0 :(得分:1)
如果我正确理解了您的层次结构,则可以使用LIKE
来比较ON子句中的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
,那么您甚至不需要联接,因为父级代码是子级代码的一部分,您只需要提取它即可:
select c.*,
substring_index(c.budget_code, '-', c.level - 1) as parent
from tbl_budget c
答案 1 :(得分:0)
签出以下查询:
模式(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。为了找到正确的答案,我们需要满足以下条件:
以上显示了如何获取父代码(即使没有连接)。但是,您的查询可以简化为以下内容:
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;
在这种情况下,我们说的是:找到一个条目,该条目比当前条目高1级,并且当前条目中包含了budget_code。请注意,您可以将parent_id更改为parent_code,但是如果需要代码,我会避免加入