走得最远 parent

Get furthest parent

相同 table 的多行可以通过 parent_id 相互关联。有没有办法获得给定行的最远 parent(有附加条件,如 id > 12)?

+----+-----------+
| id | parent_id |
+----+-----------+
| 12 |         1 |
+----------------+
| 13 |        12 |
+----------------+
| 14 |        13 |
+----------------+
| 15 |        14 |
+----------------+

有没有合理的方法在 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。我们跟踪层次结构中的级别。然后,外部查询过滤具有最大级别的记录。

Demo on DB Fiddle:

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

Demo on dbfiddle