获取所有父节点

时间:2014-07-15 03:37:20

标签: mysql sql recursive-query

不使用存储过程,有没有办法将所有父节点作为单独的行?

示例数据:

id | parent_id | name
---------------------
 1 |      NULL | Cat1
 2 |      NULL | Cat2
 3 |         1 | Cat3
 4 |         3 | Cat4
 5 |         4 | Cat5
 6 |         2 | Cat6
 7 |      NULL | Cat7

当所有父母都在id = 5行时,结果将是:

id | parent_id | name
---------------------
 1 |      NULL | Cat1
 3 |         1 | Cat3
 4 |         3 | Cat4

我应该注意:我可以进行多次连接(从而为检索到的父级数创建一个固定限制)。

3 个答案:

答案 0 :(得分:1)

你可以尝试这个查询。

select a.* 
  from table1 a 
 inner join  table1 b 
    on a.id = b.parent_id
 where b.id <= 5

感谢。

以下是Sql Fiddle

答案 1 :(得分:0)

您可以尝试引入其他列 - path,其中父级路径表示为字符串<root id>_<first level child id>_<second level child id>_

所以5的路径是&#34; 1_3_4&#34;。您需要一个触发器来将路径更新为parent node path +"_<parent id>"。因此,当您将cat5兄弟8 | 4 | cat8路径插入父级时将是相同的&#34; 1_3_4&#34;。

然后,要查找父行的所有路径,您可以检查父路径是否包含id。

答案 2 :(得分:0)

回复Finding all parents in mysql table with single query (Recursive Query)的类似帖子

我将父ID存储在不同的表

SELECT
  T2.id,
  T2.name
FROM (
       SELECT
         @r AS _id,
         (SELECT @r := parent_id FROM record_parents WHERE record_id = _id) AS parent_id,
         @l := @l + 1 AS lvl
       FROM
         (SELECT @r := 25797, @l := 0) vars,
         records m
       WHERE @r <> 1) T1
  JOIN records T2 ON T1._id = T2.id
ORDER BY T1.lvl DESC;

以上帖子修改过的代码