복붙노트

[SQL] 그것은 어떤 깊이로, 하나의 쿼리에서 MySQL은 트리 구조의 테이블을 쿼리 할 수 ​​있습니까?

SQL

그것은 어떤 깊이로, 하나의 쿼리에서 MySQL은 트리 구조의 테이블을 쿼리 할 수 ​​있습니까?

나는 대답은 '노 생각하지 해요,하지만 난 그것을 좋아할 것이다 그것을 누구 SQL (MySQL은)에서 어떤 깊이로 트리 구조를 크롤링하는 방법에 어떤 통찰력을 가지고 있지만, 하나의 쿼리

보다 구체적으로, 트리 구조 테이블 (ID, 데이터, 데이터, PARENT_ID), 테이블의 한 행을 부여, 모든 자손 (자식 / 손자 / 등)을 얻을 수 있습니다, 또는 모든 조상 문제에 대한 (부모 / 조부모 / 등)는 단일 쿼리를 사용하여, 얼마나 멀리 아래로 나 갈 것까지 모르고?

나는 새로운 결과가없는 깊이까지 쿼리 계속 경우 또는 재귀 어떤 종류의 필요로 사용?

특히, 루비와 레일스를 사용하고 있지만, 나는 그것이 매우 관련이없는 같은데요.

해결법

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

    1.예, 이것은 최선 여기에 설명 된대로는, 수정 된 예약 주문 트리 순회이라고, 가능하다

    예, 이것은 최선 여기에 설명 된대로는, 수정 된 예약 주문 트리 순회이라고, 가능하다

    에 smarties에 대한 SQL에서 조 셀코의 나무와 계층 구조

    (PHP)에서 동작하는 예제가 여기에 제공된다

    http://www.sitepoint.com/article/hierarchical-data-database/2/

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

    2.여기에 몇 가지 자료입니다 :

    여기에 몇 가지 자료입니다 :

    기본적으로, 당신은 저장 프로 시저 또는 쿼리에서 커서의 일종을하거나 인접성 테이블을 구축해야합니다. 나는 dB의 재귀 외부를 피할 것 : 당신의 나무가 얼마나 깊이에 따라, 그건 정말 느린 / 스케치 얻을 수 있습니다.

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

    3.다니엘 비어 즐리의 대답은 전혀 나쁜 솔루션은 사용자가 요구하는 주요 질문은 '모든 부모님 무엇'과 '모든 아이들 어떤'때하는 것이 아니다.

    다니엘 비어 즐리의 대답은 전혀 나쁜 솔루션은 사용자가 요구하는 주요 질문은 '모든 부모님 무엇'과 '모든 아이들 어떤'때하는 것이 아니다.

    알렉스 와인 스타 인에 대응하여,이 방법은 실제로 Celko 기술보다 부모 운동에 노드에 덜 업데이트가 발생합니다. Celko의 기술에서, 트리의 오른쪽, 다음, 거의 모든 노드에 레벨 1 노드 아래에 맨 왼쪽 이동에 레벨 2 노드가 아니라 단지 노드의 아이보다, 업데이트 필요가있는 경우.

    내가 그러나 말을하는 것은 다니엘 가능성이 잘못된 방향으로 주위의 루트 경로 등을 저장하는 것입니다.

    쿼리가 될 수 있도록 내가 그들을 저장하는 것

    SELECT FROM table WHERE ancestors LIKE "1,2,6%"
    

    MySQL은이 선도적 %로 할 수 없을 것 '조상'컬럼에 인덱스의 사용을 만들 수있는이 수단.

  4. ==============================

    4.나는 전에이 문제를 가로 질러 와서 하나의 엉뚱한 생각을했다. 당신은 루트에있는 모든 방법을 다시 직접 조상의 식별자의 문자열을 연결됩니다 각 레코드의 필드를 저장할 수 있습니다.

    나는 전에이 문제를 가로 질러 와서 하나의 엉뚱한 생각을했다. 당신은 루트에있는 모든 방법을 다시 직접 조상의 식별자의 문자열을 연결됩니다 각 레코드의 필드를 저장할 수 있습니다.

    (이 같은 기록을 가지고 상상 들여 쓰기 계층을 의미하고, 숫자, 조상 ID입니다.

    그런 다음 ID의 후손 선택 : 6, 단지 이렇게

    SELECT FROM table WHERE ancestors LIKE "%6,2,1"
    

    지금까지 조상의 열을 유지하는 것은 당신에게 그것의 가치보다 더 문제가 될 수 있지만 그것은 어떤 DB에 가능한 솔루션입니다 수 있습니다.

  5. ==============================

    5.Celko의 기술 (중첩 된 세트) 꽤 좋다. 나는 또한 필드 "조상"과 "후손"과 "거리"로 인접성 테이블을 사용했다 (예를 들어, 직접 자녀 / 부모 등, 2의 거리가 1, 손자 / 조부모의 거리가).

    Celko의 기술 (중첩 된 세트) 꽤 좋다. 나는 또한 필드 "조상"과 "후손"과 "거리"로 인접성 테이블을 사용했다 (예를 들어, 직접 자녀 / 부모 등, 2의 거리가 1, 손자 / 조부모의 거리가).

    이 요구는 유지하지만, 삽입을 위해 할 매우 쉽게 할 수 : 테이블에 당신이 트랜잭션을 사용 후 직접 링크를 넣어 (부모, 자식, 거리 = 1), 다음 INSERT (거리를 추가하여 기존의 부모 및 자녀의 선택을 무시 내가 성능을 위해 3 개 각 필드에 인덱스를 원하는 기회)이있을 때 나는 SQL을 끌어 할 수 있습니다. 이 방법은 추한은 삭제입니다 얻을 어디 ... 당신은 기본적으로 영향을받은 모든 항목을 표시해야 다음이를 다시. 그러나 이것의 장점은 중첩 된 세트 모델은 직선 계층 만이 할 수있는 반면에 (루트를 제외한 각 항목은 오직 하나의 부모가, 예를 들어), 임의의 비순환 그래프를 처리 할 수 ​​있다는 것입니다.

  6. ==============================

    6.SQL은 루프의 이런 종류를 수행 할 수하지 않을거야 의미 튜링 완전한 언어가 아닙니다. 당신은 SQL 및 트리 구조와 매우 영리한 일을 할 수있다,하지만 난 임의 깊이의 계층 구조 "의 계층 구조에서"특정 ID를 가진 행을 설명하는 방법을 생각할 수 없다.

    SQL은 루프의 이런 종류를 수행 할 수하지 않을거야 의미 튜링 완전한 언어가 아닙니다. 당신은 SQL 및 트리 구조와 매우 영리한 일을 할 수있다,하지만 난 임의 깊이의 계층 구조 "의 계층 구조에서"특정 ID를 가진 행을 설명하는 방법을 생각할 수 없다.

    가장 좋은 방법은 @Dan 그냥 다른, 더 할 수있는 언어로 트리를 통해 귀하의 방식으로 작동되는, 어떤 제안의 라인을 따라 무언가이다. 당신은 실제로 당신이 찾고있는 계층 구조의 깊이를 반영하는 쿼리 (서브 쿼리 나) 조인의 좀 복잡한 일련의 루프를 사용하여 범용 언어의 쿼리 문자열을 생성 할 수 있습니다. 즉 루핑 및 여러 쿼리보다 더 효율적으로 될 것입니다.

  7. ==============================

    7.이것은 확실히 수행 할 수 있으며 SQL에 대한 복잡하지됩니다. 이 질문에 대한 답변과 여기에 MySQL은 절차 적 코드를 사용하여 작업 예제를 제공했습니다 :

    이것은 확실히 수행 할 수 있으며 SQL에 대한 복잡하지됩니다. 이 질문에 대한 답변과 여기에 MySQL은 절차 적 코드를 사용하여 작업 예제를 제공했습니다 :

    MySQL은 어떻게 특정 노드에서 잎을 찾을 수

    부스 : 당신이 만족하는 경우 받아, 당신이 대답 중 하나를 표시해야합니다.

  8. ==============================

    8.I는 (https://stackoverflow.com/users/1726419/yossico 의해 제공) https://stackoverflow.com/questions/27013093/recursive-query-emulation-in-mysql에 기재된 "에뮬레이터"루틴을 사용했다. 지금까지 내가 들어 왔 아주 좋은 결과 (성능 현명한),하지만 난에 대한 / 통해 검색 할 데이터의 풍요 로움이나 후손의 다수가 없습니다.

    I는 (https://stackoverflow.com/users/1726419/yossico 의해 제공) https://stackoverflow.com/questions/27013093/recursive-query-emulation-in-mysql에 기재된 "에뮬레이터"루틴을 사용했다. 지금까지 내가 들어 왔 아주 좋은 결과 (성능 현명한),하지만 난에 대한 / 통해 검색 할 데이터의 풍요 로움이나 후손의 다수가 없습니다.

  9. ==============================

    9.당신은 거의 확실히 그 일부 재귀를 사용 할 것입니다. 당신이 그 일을하고 있다면, 그것은 사소한 것 고정 된 깊이로 전체 트리보다는 비트를 얻기 위해 (사실은 쉽게에서).

    당신은 거의 확실히 그 일부 재귀를 사용 할 것입니다. 당신이 그 일을하고 있다면, 그것은 사소한 것 고정 된 깊이로 전체 트리보다는 비트를 얻기 위해 (사실은 쉽게에서).

    정말 거친 의사 코드에서는이 라인을 따라 뭔가를 할 것입니다 :

    getChildren(parent){
        children = query(SELECT * FROM table WHERE parent_id = parent.id)
        return children
    }
    
    printTree(root){
        print root
        children = getChildren(root)
        for child in children {
            printTree(child)
        }
    }
    

    실제로 비록 당신은 거의 같은 것을 할 싶지 않을 것입니다. 이 테이블의 모든 행에 대해 하나 개의 요청을 만들고 이후에만 너무 깊게 중첩되지 않은 중 작은 테이블, 또는 나무에 대한 분별 수 있습니다, 그래서 그것은 오히려 비효율적 일 수 있습니다. 솔직히 말해서, 어떤 경우에 당신은 아마 깊이를 제한 할 수 있습니다.

    그러나, 데이터 구조의 이러한 종류의 인기 주어, 아주 잘 특히 당신이 할 필요가 쿼리의 수를 줄이기 위해,이 당신을 도움이되는 몇 가지 MySQL의 물건이있을 수 있습니다.

    편집 : 그것에 대해 생각 데 그것은 모든 쿼리를 만들기 위해 거의 의미가 있습니다. 어쨌든 전체 테이블을 읽는 경우에, 당신은 RAM으로 전체를 후루룩 소리 내며 먹기 있습니다 - 그것은 작은 충분 가정!

  10. from https://stackoverflow.com/questions/169817/is-it-possible-to-query-a-tree-structure-table-in-mysql-in-a-single-query-to-an by cc-by-sa and MIT license