use*_*359 3 sql postgresql postgresql-9.1
This is the table
user_id | parent_id | lft
--------|-----------|-----
1 | | 0
2 | 1 | 0
3 | 1 | 0
4 | 2 | 0
Run Code Online (Sandbox Code Playgroud)
Here is a query to do a CTE from node 1 and traverse all the children of user_id 1 until a leaf is reached and update the value of the travesed chidren lft field to 1
WITH RECURSIVE d AS (
SELECT user_id
FROM btrees
WHERE user_id = 1
UNION ALL
SELECT c.user_id
FROM d JOIN btrees c ON c.parent_id = d.user_id
)
UPDATE btrees b set lft = 1
FROM d
WHERE d.user_id = b.user_id
Run Code Online (Sandbox Code Playgroud)
I am just asking for a query that will go in the opposite direction .. ie. from any node to the root node so I can update the value of lft
更新从某个节点开始直到根节点的所有节点的查询非常相似:
WITH RECURSIVE d AS (
SELECT user_id
FROM btrees
WHERE user_id = :node_id
UNION ALL
SELECT c.user_id
FROM d JOIN btrees c ON d.parent_id = c.user_id
)
UPDATE btrees b set lft = 1
FROM d
WHERE d.user_id = b.user_id
Run Code Online (Sandbox Code Playgroud)
请注意,连接中的条件是相反的.
通常,递归查询的工作方式如下: