반응형
모든 부모가 있는 트리에 있는 노드의 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;
언급URL : https://stackoverflow.com/questions/60018635/get-full-tree-of-parent-child-relationships-in-mysql-of-any-node-in-the-tree-wit
반응형
'programing' 카테고리의 다른 글
| 텍스트를 포함하는 요소만 반환하고 상위 항목은 반환하지 않는 XPath (0) | 2023.09.12 |
|---|---|
| 공간 조인이 있는 mysql 뷰가 작동하지 않습니다. (0) | 2023.09.12 |
| 스프링 빈즈 - 컨스트럭터 arg로 널 배선하는 방법? (0) | 2023.09.12 |
| 가장 적은 양의 명령에서 가장 빠른 정수 제곱근 (0) | 2023.09.12 |
| Mapstruct - Generated Mapper 클래스에서 스프링 종속성을 주입하는 방법 (0) | 2023.09.12 |