簡體   English   中英

獲取所有父節點

[英]Get all parent nodes

不使用存儲過程,有沒有辦法將所有父節點作為單獨的行?

示例數據:

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

我應該注意:我可以進行多個連接(從而對檢索到的父級數量創建一個固定限制)。

你可以嘗試這個查詢。

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

謝謝。

這是Sql小提琴

您可以嘗試引入其他列- 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。

類似的答案答案用單個查詢(遞歸查詢)在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;

從上面的帖子修改的代碼

對於 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。

在這里看小提琴

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM