走得最远 parent
Get furthest parent
相同 table 的多行可以通过 parent_id 相互关联。有没有办法获得给定行的最远 parent(有附加条件,如 id > 12
)?
+----+-----------+
| id | parent_id |
+----+-----------+
| 12 | 1 |
+----------------+
| 13 | 12 |
+----------------+
| 14 | 13 |
+----------------+
| 15 | 14 |
+----------------+
- 给出的是 id 15
- 需要的是id 13(因为是id大于12的最远parent)
有没有合理的方法在 1 条语句中执行此操作,而不是再次遍历最近的 parent?
在 MySQL 8.0 中,您可以使用递归查询来执行此操作:
with recursive cte as (
select id, parent_id, 0 lvl from mytable where id = 15
union all
select c.id, t.parent_id, c.lvl + 1
from mytable t
inner join cte c on c.parent_id = t.id
where t.parent_id > 12
)
select id, parent_id
from cte c
where c.lvl = (select max(c1.lvl) from cte c1 where c1.id = c.id)
递归cte从id = 15
开始,然后沿着关系树,直到id严格小于12
的a parent。我们跟踪层次结构中的级别。然后,外部查询过滤具有最大级别的记录。
id | parent_id
-: | --------:
15 | 13
您可以使用递归 CTE 查找给定 id
值的所有父级,并为它们分配 level
以指示它们与原始 id
价值。那么就是找id
这个最大level
的值也大于12的情况:
WITH RECURSIVE CTE AS
(
SELECT id, parent_id, 1 AS level
FROM data
WHERE id = 15
UNION ALL
SELECT data.id, data.parent_id, CTE.level + 1
FROM data
JOIN CTE ON data.id = CTE.parent_id
WHERE data.id > 12
)
SELECT id
FROM CTE
WHERE level = (SELECT MAX(level) FROM CTE)
输出
13
相同 table 的多行可以通过 parent_id 相互关联。有没有办法获得给定行的最远 parent(有附加条件,如 id > 12
)?
+----+-----------+
| id | parent_id |
+----+-----------+
| 12 | 1 |
+----------------+
| 13 | 12 |
+----------------+
| 14 | 13 |
+----------------+
| 15 | 14 |
+----------------+
- 给出的是 id 15
- 需要的是id 13(因为是id大于12的最远parent)
有没有合理的方法在 1 条语句中执行此操作,而不是再次遍历最近的 parent?
在 MySQL 8.0 中,您可以使用递归查询来执行此操作:
with recursive cte as (
select id, parent_id, 0 lvl from mytable where id = 15
union all
select c.id, t.parent_id, c.lvl + 1
from mytable t
inner join cte c on c.parent_id = t.id
where t.parent_id > 12
)
select id, parent_id
from cte c
where c.lvl = (select max(c1.lvl) from cte c1 where c1.id = c.id)
递归cte从id = 15
开始,然后沿着关系树,直到id严格小于12
的a parent。我们跟踪层次结构中的级别。然后,外部查询过滤具有最大级别的记录。
id | parent_id -: | --------: 15 | 13
您可以使用递归 CTE 查找给定 id
值的所有父级,并为它们分配 level
以指示它们与原始 id
价值。那么就是找id
这个最大level
的值也大于12的情况:
WITH RECURSIVE CTE AS
(
SELECT id, parent_id, 1 AS level
FROM data
WHERE id = 15
UNION ALL
SELECT data.id, data.parent_id, CTE.level + 1
FROM data
JOIN CTE ON data.id = CTE.parent_id
WHERE data.id > 12
)
SELECT id
FROM CTE
WHERE level = (SELECT MAX(level) FROM CTE)
输出
13