복붙노트

[SQL] MySQL의 재귀?

SQL

MySQL의 재귀?

이 같은 테이블을 고려 :

   folders_table
   -----------------------
      INT id_folder
      INT id_folder_parent
      VARCHAR folder_name

어떤 상점 간단한 디렉토리 구조를. 어떻게 하나의 SELECT 쿼리 디렉토리의 모든 하위 디렉토리를 얻을 수 있을까?

해결법

  1. ==============================

    1.그것은 가능하지만, 당신은 당신의 데이터베이스 구조를 변경해야합니다; 변경 사항이되면, 당신은 하나 개의 쿼리에 어떤 깊이의 트리를 검색 할 수 있습니다. 쿼리는 약간 더 복잡하지만, 여전히 꽤 간단합니다.

    그것은 가능하지만, 당신은 당신의 데이터베이스 구조를 변경해야합니다; 변경 사항이되면, 당신은 하나 개의 쿼리에 어떤 깊이의 트리를 검색 할 수 있습니다. 쿼리는 약간 더 복잡하지만, 여전히 꽤 간단합니다.

  2. ==============================

    2.당신이 보여 테이블 구조로,이는 재귀 쿼리를 지원하지 않는 MySQL을 수행 할 수 없습니다

    당신이 보여 테이블 구조로,이는 재귀 쿼리를 지원하지 않는 MySQL을 수행 할 수 없습니다

  3. ==============================

    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. ==============================

    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. ==============================

    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의에서 재귀을한다.

    즉, 데이터를 기록 할 때 구조를 유지해야하지만, 쿼리가 빠르고, 쉽고입니다. 쿼리가 빈번한 경우,이 잘 작동합니다. 쓰기가 빈번한 경우에, 다만이 방법 대신 캐시를 사용합니다.

  6. from https://stackoverflow.com/questions/4345909/mysql-recursion by cc-by-sa and MIT license