programing

모든 부모가 있는 트리에 있는 노드의 mysql에서 부모/자녀 관계의 전체 트리 가져오기

newnotes 2023. 9. 12. 20:43
반응형

모든 부모가 있는 트리에 있는 노드의 mysql에서 부모/자녀 관계의 전체 트리 가져오기

예제 데이터:

+----+-------+----------+
| org_id | Name  | ParentID |
+----+-------+----------+
|  1 | Org1  | 2        |
|  2 | Org2  | NULL     |
|  3 | Org3  | 5        |
|  5 | Org5  | 1        |
| 14 | Org14 | 1        |
+----+-------+----------+

org_id 1(Org1)로 사용자로 로그인한 경우저는 그 사용자의 전체 트리를 검색하고 싶습니다.

다음과 같은 재귀적 쿼리가 있습니다.

WITH RECURSIVE cte (org_id, name, parent_id) AS (
     SELECT org_id, name, parent_id
     FROM organization
     WHERE org_id = 1
     UNION ALL
     SELECT t1.org_id, t1.name, t1.parent_id
     FROM organization t1
     INNER JOIN cte t2 ON t1.parent_id = t2.org_id
)
SELECT * FROM cte;

그러나 이 쿼리는 현재 id(이 예에서는 Org1)의 자식만 제공합니다.결과 세트에 부모님도 모두 포함시켜 트리 전체를 정확하게 재구축할 수 있는 방법은 무엇입니까?

편집: MariaDB 버전 10.4.10을 사용하고 있습니다.

편집: 아래 답변과 같이 쿼리를 시도했는데 구문 오류가 발생합니다.

당신은 아이들을 얻을 수 있는 CTE를 가지고 있습니다.다른 사람을 이용해 반대 방향으로 가서 부모를 데려오는 것은 어떨까요?

MySQL:

(WITH RECURSIVE cte (id, name, parent_id) AS (
     SELECT id, name, parent_id
     FROM organization
     WHERE id = 1
     UNION  
     SELECT t1.id, t1.name, t1.parent_id
     FROM organization t1
       INNER JOIN cte t2 ON t1.parent_id = t2.id 
)
SELECT * FROM cte)
UNION
(WITH RECURSIVE cte (id, name, parent_id) AS (
     SELECT id, name, parent_id
     FROM organization
     WHERE id = 1
     UNION 
     SELECT t1.id, t1.name, t1.parent_id
     FROM organization t1
       INNER JOIN cte t2 ON t2.parent_id = t1.id 
)
SELECT * FROM cte)

그리고 MySQL과 Maria 둘다 작동하는 버전.DB:

MySQL/MariaDB:

WITH RECURSIVE cte (id, name, parent_id, dir) AS (
     SELECT id, name, parent_id, cast(null as char(10)) as dir
     FROM organization
     WHERE id = 1
     UNION  
     SELECT t1.id, t1.name, t1.parent_id, ifnull(t2.dir, 'down')
     FROM organization t1
       INNER JOIN cte t2 ON t1.parent_id = t2.id and ifnull(t2.dir, 'down')='down'
     UNION
     SELECT t1.id, t1.name, t1.parent_id, ifnull(t2.dir, 'up')
     FROM organization t1
       INNER JOIN cte t2 ON t2.parent_id = t1.id and ifnull(t2.dir, 'up')='up'
)
SELECT id, name, parent_id FROM cte;

db-fiddledbfiddle 참조

언급URL : https://stackoverflow.com/questions/60018635/get-full-tree-of-parent-child-relationships-in-mysql-of-any-node-in-the-tree-wit

반응형