MySQL中递归获取最高父id

Goo*_*bot 3 mysql join query recursive

我想找到每个条目最上面的父 ID。例如,

CREATE TABLE t1
(
ID int(11) unsigned NOT NULL,
ParentID int(11) unsigned,
PRIMARY KEY (ID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_general_ci;

INSERT INTO t1 (ID,ParentID) VALUES (1,NULL),(2,1),(3,2),(4,3);
Run Code Online (Sandbox Code Playgroud)

我意图得到

ID     Highest ParentID
1      NULL
2      1
3      1
4      1
Run Code Online (Sandbox Code Playgroud)

我计划创建一个递归查询(MySQL 8 或 MariaDB 10.5),方法是添加一个条件,以在 Parent ID 为特定值(例如,上述情况下为 NULL)时中断递归。我开始于

WITH RECURSIVE cte (ID, ParentID) as (
  SELECT ID,ParentID FROM t1
  UNION ALL
  SELECT t2.ID,t2.ParentID FROM t1 t2
  INNER JOIN cte on t2.ParentID = cte.ID
)
SELECT * FROM cte;
Run Code Online (Sandbox Code Playgroud)

但它并没有按照我的预期工作,因为它获取下一个 ParentID 而不是递归。

小提琴样本。

Aki*_*ina 6

WITH RECURSIVE 
cte as ( SELECT id, id nextid, parentid 
         FROM t1
       UNION ALL
         SELECT cte.id, t1.id, t1.parentid
         FROM t1
         JOIN cte ON cte.parentid = t1.id )
SELECT Id, nextid RootId
FROM cte
WHERE parentid IS NULL
Run Code Online (Sandbox Code Playgroud)

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=209df940143d3e984d418e49929bd847