문제

다음 열이있는 밀 중첩 세트 계층 유형 설정을 실행합니다.

테이블 이름 :

myset

열 :

id, name, lft, rgt

누구든지 결정할 쿼리를 알고 있습니까? 부모의 노드의?

나는 또한 parent_id 테이블에있는 열을 추적하기 위해 열이 중복되는 것처럼 보이지만 세트 내에서 무엇이든 추가/제거/이동할 때 쿼리가 잘못 실행되면 중첩 세트와 동기화되지 않는 것처럼 보입니다.

도움이 되었습니까?

해결책

보다 이 질문. 그것은 당신과 비슷합니다. 필요한 쿼리를 게시했습니다.

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

다른 팁

상단은 MSSQL 명령이며 MySQL의 사용 제한입니다.

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

트릭을해야합니다 ..

이 답변에 추가하기 위해 많은 도움이되었습니다.

나는 노드의 직계 부모와 어떤 경우에는 노드 체인의 최상위 부모를 찾아야했습니다.

나는 다음을 아이에서 부모 주문으로 얻기 위해 기반으로 사용했습니다.

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 빈 결과 세트를 반환해야합니다

최상위 수준의 부모를 얻으려면 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

마지막 쿼리에서 사용했습니다 >= <= 선택한 범위가 최고 수준의 부모 인 경우 선택한 범위가 하위 노드를 포함하도록 연산자

Lucasz의 질문에 문제가있었습니다. MySQL 버전은 최상위 명령을 이해하지 못했습니다. 대신 한도를 사용해야했습니다. 수정 된 코드는 다음과 같습니다.

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

분명히, 당신의 요구에 맞게 []의 물건을 바꾸십시오. 또한 [] s를 제거하십시오. 이 쿼리는 한 행만 반환합니다. 그렇게 ...

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

주문/ 한도 대신 최대를 사용할 수 있으며 데이터베이스에 따라 결과를 한 행으로 제한하려면 다른 키워드가 필요할 수 있습니다. 데이터베이스가 MySQL이 아닌 독점 세트를 반환하면 <과>가 아닌 사이에 작동합니다.

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;

모든 조상은 다시 돌아옵니다

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

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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top