복붙노트

[SQL] MySQL의 중첩 된 세트는 - 어떻게 노드의 부모를 찾는 방법은?

SQL

MySQL의 중첩 된 세트는 - 어떻게 노드의 부모를 찾는 방법은?

나는 다음과 같은 열이 밀 중첩 세트 계층 구조 유형 설정의 러닝을 가지고 :

테이블 이름 :

myset

열 :

id, name, lft, rgt

사람이 노드의 부모를 결정하는 쿼리를 알고 있나요?

나는이 추적 할 테이블에 PARENT_ID 열을 가지고 편리하지만 그것이 중복 보인다는 쿼리가 잘못 추가 할 때 실행 된 경우는 중첩 된 세트와 동기화 얻을 수있는 것처럼 보인다 몇 곳을 읽기 / / 제거 설정에서 아무것도 이동.

해결법

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

    1.이 질문에 봐. 그것은 당신과 유사하다. 나는이 필요할 수있는 쿼리를 기록했다.

    이 질문에 봐. 그것은 당신과 유사하다. 나는이 필요할 수있는 쿼리를 기록했다.

    SELECT title, (SELECT TOP 1 title 
               FROM tree t2 
               WHERE t2.lft < t1.lft AND t2.rgt > t1.rgt    
               ORDER BY t2.rgt-t1.rgt ASC) AS parent
    FROM tree t1
    ORDER BY rgt-lft DESC
    

    나는 당신이 필요가 있기를 바랍니다.

    다음 표를 들면 :

    +-------------+----------------------+-----+-----+
    | category_id | name                 | lft | rgt |
    +-------------+----------------------+-----+-----+
    |           1 | ELECTRONICS          |   1 |  20 |
    |           2 | TELEVISIONS          |   2 |   9 |
    |           3 | TUBE                 |   3 |   4 |
    |           4 | LCD                  |   5 |   6 |
    |           5 | PLASMA               |   7 |   8 |
    |           6 | PORTABLE ELECTRONICS |  10 |  19 |
    |           7 | MP3 PLAYERS          |  11 |  14 |
    |           8 | FLASH                |  12 |  13 |
    |           9 | CD PLAYERS           |  15 |  16 |
    |          10 | 2 WAY RADIOS         |  17 |  18 |
    

    이것은 출력을 생성

    title                | parent
    ----------------------------------------------
    ELECTRONICS          | NULL
    PORTABLE ELECTRONICS | ELECTRONICS
    TELEVISIONS          | ELECTRONICS
    MP3 PLAYERS          | PORTABLE ELECTRONICS
    FLASH                | MP3 PLAYERS
    CD PLAYERS           | PORTABLE ELECTRONICS
    2 WAY RADIOS         | PORTABLE ELECTRONICS
    TUBE                 | TELEVISIONS
    LCD                  | TELEVISIONS
    PLASMA               | TELEVISIONS
    
  2. ==============================

    2.TOP는 MySQL을위한 MSSQL 명령, 사용 LIMIT입니다 :

    TOP는 MySQL을위한 MSSQL 명령, 사용 LIMIT입니다 :

    SELECT title, (SELECT title 
           FROM tree t2 
           WHERE t2.lft < t1.lft AND t2.rgt > t1.rgt    
           ORDER BY t2.rgt-t1.rgt ASC
           LIMIT 1) 
    AS parent FROM tree t1 
    ORDER BY (rgt-lft) DESC
    

    트릭을 할해야 ..

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

    3.단지 많은 나를 도움이 답변에 추가하려면,

    단지 많은 나를 도움이 답변에 추가하려면,

    나는, 어떤 경우에는 노드의 바로 위 부모뿐만 아니라 노드 체인의 가장 최상위 부모를 찾을 필요

    나는 아이에게 부모 순서로 항목을 얻을 수있는 도심 다음을 사용

    SELECT parent.*  FROM
            nested_set node,
            nested_set parent
            WHERE (
                node.set_left BETWEEN parent.set_left AND parent.set_right          
            )
            AND node.set_id={CHILD_NODE_ID_HERE}
            ORDER BY parent.set_right - parent.set_left
            #LIMIT 1,1
    

    만 바로 부모가 될 것입니다 두 번째 행을 캡처하는 LIMIT 1,1를 추가하는 문제이다

    또한 노드 자체가 매우 최고 수준의 부모 인 경우 위의 쿼리와 함께, 다음은, 즉시 부모가없는 것 때문에 LIMIT와 1,1가 빈 결과 집합을 반환해야 함을 유의해야한다

    매우 최상위 부모를 얻을 난 ORDER BY 절 반전 노드 자체가 부모 상단이면 체크를 포함하고, 제 1 행에 대한 결과를 한정

    SELECT parent.* AS top_level_right FROM
            nested_set node,
            nested_set parent
            WHERE (
                node.set_left >= parent.set_left 
                AND node.set_left <= parent.set_right
            )
            AND node.set_id={CHILD_NODE_ID_HERE}
            ORDER BY parent.set_left - parent.set_right
            LIMIT 1
    

    마지막 쿼리 나> 사용 = <= 연산자 그래서 또한 최상위 부모가 일어나는 경우, 선택된 범위는 자식 노드를 포함하는 것으로

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

    4.나는 Lucasz의 쿼리에 문제가 있었다. MySQL의 내 버전은 TOP 명령을 이해하지 못했다. 내가 대신 LIMIT를 사용했다. 다음은 수정 된 코드입니다.

    나는 Lucasz의 쿼리에 문제가 있었다. MySQL의 내 버전은 TOP 명령을 이해하지 못했다. 내가 대신 LIMIT를 사용했다. 다음은 수정 된 코드입니다.

    SELECT 
       `id`, 
       (SELECT 
          `id`
        FROM 
           `[*** YOUR TABLE ***]` AS `t2` 
        WHERE 
           `t2`.`left_id`  < `t1`.`left_id`AND 
           `t2`.`right_id` > `t1`.`right_id`
        ORDER BY 
           `t2`.`right_id`-`t1`.`right_id`ASC 
        LIMIT 
           1) AS `parent`
    FROM 
        `[*** YOUR TABLE ***]` AS `t1`
    WHERE 
        `t1`.`id` = [*** ID OF THE NODE WHOS PARENT YOU WISH TO LOOKUP ***]
    ORDER BY 
        `right_id`-`left_id` DESC
    

    물론, [] 사용자의 요구에 맞게이야에 물건을 변경합니다. 또한, []의 제거. 이 쿼리는 하나 개의 행을 반환합니다. 같은 ...

    id  parent
    7   3
    
  5. ==============================

    5.

    select * from myset
      where lft < :lftOfCurrent and rgt > :lftOfCurrent
      order lft desc
      limit 1
    

    당신은 최대가 아닌 주문 / 제한을 사용할 수 있습니다 당신은 당신의 데이터베이스에 따라 한 행에 결과를 제한하는 또 다른 키워드를해야 할 수도 있습니다. 데이터베이스는 MySQL을하지 않는 독점 세트를 반환하는 경우보다는 <와> 사이에 작동합니다.

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

    6.

    SELECT parent.name 
    FROM myset AS node, myset AS parent 
    WHERE parent.lft < node.lft 
    AND parent.rgt > node.rgt 
    AND node.id = {YOUR CATEGORY ID} 
    ORDER BY ( parent.rgt - parent.lft ) ASC LIMIT 1;
    
  7. ==============================

    7.모든 조상은에 의해 반환되는

    모든 조상은에 의해 반환되는

    SELECT id FROM thetable
    WHERE x BETWEEN lft and rgt;
    

    그래서, 직접 부모 LFT와 RGT 사이의 작은 차이가 조상이다.

    SELECT id FROM thetable
    WHERE x BETWEEN lft and rgt
    ORDER BY (rgt-lft)
    LIMIT 1
    
  8. ==============================

    8.spankmaster79에서 코드는 완전히 잘못이 아니었다. 나는 그의 코드를 수정하고 일했다.

    spankmaster79에서 코드는 완전히 잘못이 아니었다. 나는 그의 코드를 수정하고 일했다.

    SELECT parent . * FROM Nested_Category AS node, Nested_Category AS parent 
    enter code hereWHERE node.leftSide
    BETWEEN parent.leftSide
    AND parent.rightSide
    AND node.id ='Enter the Node ID'
    ORDER BY (
    parent.rightSide - parent.leftSide
    )
    LIMIT 1 , 1
    
  9. from https://stackoverflow.com/questions/1602536/mysql-nested-sets-how-to-find-parent-of-node by cc-by-sa and MIT license