[SQL] MySQL의 재귀?
SQLMySQL의 재귀?
이 같은 테이블을 고려 :
folders_table
-----------------------
INT id_folder
INT id_folder_parent
VARCHAR folder_name
어떤 상점 간단한 디렉토리 구조를. 어떻게 하나의 SELECT 쿼리 디렉토리의 모든 하위 디렉토리를 얻을 수 있을까?
해결법
-
==============================
1.그것은 가능하지만, 당신은 당신의 데이터베이스 구조를 변경해야합니다; 변경 사항이되면, 당신은 하나 개의 쿼리에 어떤 깊이의 트리를 검색 할 수 있습니다. 쿼리는 약간 더 복잡하지만, 여전히 꽤 간단합니다.
그것은 가능하지만, 당신은 당신의 데이터베이스 구조를 변경해야합니다; 변경 사항이되면, 당신은 하나 개의 쿼리에 어떤 깊이의 트리를 검색 할 수 있습니다. 쿼리는 약간 더 복잡하지만, 여전히 꽤 간단합니다.
-
==============================
2.당신이 보여 테이블 구조로,이는 재귀 쿼리를 지원하지 않는 MySQL을 수행 할 수 없습니다
당신이 보여 테이블 구조로,이는 재귀 쿼리를 지원하지 않는 MySQL을 수행 할 수 없습니다
-
==============================
3.MySQL의 / MariaDB하면은 열기 쿼리 그래프 엔진 (http://openquery.com/graph/doc)를 사용하여 MySQL의 플러그인 당신이 관계, 기본적으로 parentId 및 childId을 넣어 특별한 테이블을 만들 수있다.
MySQL의 / MariaDB하면은 열기 쿼리 그래프 엔진 (http://openquery.com/graph/doc)를 사용하여 MySQL의 플러그인 당신이 관계, 기본적으로 parentId 및 childId을 넣어 특별한 테이블을 만들 수있다.
마법은 실행 명령 OQGRAPH 엔진을 알려드립니다 쿼리에 전달 된 값의 따라 래치 특별한 컬럼이 테이블을 쿼리한다는 것입니다. 자세한 내용은 문서를 참조하십시오.
그것은 나무 (재귀 1-N 관계),하지만 무게 그래프 데이터 구조 (재귀 N-m 관계) (당신이 저장하는 회사의 소유로, 회사는 여러 자회사를 가질 수 원하고 또한 여러 주주를 가질 수 있음을 예를 들어 생각)뿐만 아니라 처리합니다.
-
==============================
4.다른 옵션은 저장 두 노드의 깊이와 각 노드의 전체 경로에 대한 식별자를 유지하고 기준으로이 두 가지를 사용하는 것입니다.
다른 옵션은 저장 두 노드의 깊이와 각 노드의 전체 경로에 대한 식별자를 유지하고 기준으로이 두 가지를 사용하는 것입니다.
관계형 데이터베이스의 방법 I 스토어 XML 노드는 다음과 같다 :
SELECT id,value FROM element e1 INNER JOIN element e2 ON (e2.id=e1.parent_id AND name='friend') WHERE e1.depth>4 AND e1.path like 'root[1]/users[1]/user:dana[1]/public[1]%'
이 예제에서는 노드 이름과 트리의 각 수준에서 동일한 노드 이름이 중복 된 노드에 대한 대괄호 반복자에 대한 필드를 가지고있다.
각 노드를 삽입 할 때 동시에 가게에서, 배열에 경로의 깊이를 각 레벨을 추가 (PARENT_ID가 null) 루트 노드까지 부모를 따라 전체 경로를 계산해야합니다.
특히 직접적인 재귀 SQL 구문이없는 MySQL과, 비용이 많이 드는 될 수있는 모든 요청에 트리를 다음과 같은 어떤 경로를 시각적으로 쉽게 액세스 할 수 있도록 항상 데이터베이스에 저장된 계층 구조의 모든 종류에 좋다.
계층 구조 (중첩 된 세트 인접리스트)에 노드를 저장 왼쪽 / 오른쪽 방식은 매우 관리하기 복잡 하나, 계획의 이런 종류의 잘못을 갈 수있는 내 마음 속에 너무 위험하고 훨씬 더.
-
==============================
5.1, 새 테이블을 만들 수 있습니다. tree_folder (ID, id_folder, tree_id) 2, 새 테이블을 만들 수 있습니다. 트리 (ID, tree_json)
1, 새 테이블을 만들 수 있습니다. tree_folder (ID, id_folder, tree_id) 2, 새 테이블을 만들 수 있습니다. 트리 (ID, tree_json)
나무 테이블은 전체 트리 노드를 유지합니다. 예를 들어, 루트 다음과 같은 트리 노드 1.
{ "folder_id": 1, "parent_folder_id": 0, "children": [ { "folder_id": 10, "parent_folder_id": 1, "children": null }, { "folder_id": 11, "parent_folder_id": 2, "children": null } ] }
테이블이 행이 포함되어 있습니다.
[id, tree_json] [1, "xxxxx"]
그런 다음 노드와 나무 사이의 관계를 유지합니다. 당신이 트리 노드 (1), (10)를 포함 볼 수 있듯이, 11. 그리고 우리는 테이블 tree_folder 있습니다.
[id, folder_id, tree_id] [1, 1 , 1] [2, 10 , 1] [3, 11 , 1]
때 당신은 폴더 (10)의 트리를 얻을 필요가있다. 바로 그때, 나무에서 얻을 당신이 프로그램에서 거래.
이러한 방법으로, 당신은 단지 메모리 대신 MySQL의에서 재귀을한다.
즉, 데이터를 기록 할 때 구조를 유지해야하지만, 쿼리가 빠르고, 쉽고입니다. 쿼리가 빈번한 경우,이 잘 작동합니다. 쓰기가 빈번한 경우에, 다만이 방법 대신 캐시를 사용합니다.
from https://stackoverflow.com/questions/4345909/mysql-recursion by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 무향 그래프의 연결된 모든 서브 그래프를 찾는 방법 (0) | 2020.04.02 |
---|---|
[SQL] 자바 프로그램에 방지 SQL 주입 공격 (0) | 2020.04.02 |
[SQL] SQL은 : 2 개의 다른 AUTO_INCREMENT와의 관계 테이블 만들기 (0) | 2020.04.02 |
[SQL] GROUP BY와 집계 순차적 인 숫자 값 (0) | 2020.04.02 |
[SQL] PostgreSQL은 : 같은 쿼리에서 계산 된 열을 사용하여 (0) | 2020.04.02 |