获取所有父节点



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

示例数据:

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

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

MySQL 5.5, 5.6 &5.7

SELECT @r AS user_id, 
   (SELECT @r := parent_id FROM users_table WHERE id = user_id) AS parent_id, 
   @l := @l + 1 AS level 
   FROM (SELECT @r := 9, @l := 0) val, users_table WHERE @r <> 0 

注:@r:= 9。其中9为子用户id。

见此处


上面的查询在MySQL 8中已弃用。这是MySQL 8.0

的查询
with recursive parent_users (id, parent_id, level) AS (
  SELECT id, parent_id, 1 level
  FROM users_table
  WHERE id = 9
  union all
  SELECT t.id, t.parent_id, level + 1
  FROM users_table t INNER JOIN parent_users pu
  ON t.id = pu.parent_id
)
SELECT * FROM parent_users;

备注:id = 9。其中9为子用户id。

请参阅此处

可不可以试试这个查询。

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

谢谢。

类似的帖子与答案找到所有的父母在mysql表与单一查询(递归查询)

我有父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;

修改了上面的代码

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

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

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

相关内容

  • 没有找到相关文章

最新更新