[SQL] MySQL의 중첩 된 세트는 - 어떻게 노드의 부모를 찾는 방법은?
SQLMySQL의 중첩 된 세트는 - 어떻게 노드의 부모를 찾는 방법은?
나는 다음과 같은 열이 밀 중첩 세트 계층 구조 유형 설정의 러닝을 가지고 :
테이블 이름 :
myset
열 :
id, name, lft, rgt
사람이 노드의 부모를 결정하는 쿼리를 알고 있나요?
나는이 추적 할 테이블에 PARENT_ID 열을 가지고 편리하지만 그것이 중복 보인다는 쿼리가 잘못 추가 할 때 실행 된 경우는 중첩 된 세트와 동기화 얻을 수있는 것처럼 보인다 몇 곳을 읽기 / / 제거 설정에서 아무것도 이동.
해결법
-
==============================
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.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.단지 많은 나를 도움이 답변에 추가하려면,
단지 많은 나를 도움이 답변에 추가하려면,
나는, 어떤 경우에는 노드의 바로 위 부모뿐만 아니라 노드 체인의 가장 최상위 부모를 찾을 필요
나는 아이에게 부모 순서로 항목을 얻을 수있는 도심 다음을 사용
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.나는 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.
select * from myset where lft < :lftOfCurrent and rgt > :lftOfCurrent order lft desc limit 1
당신은 최대가 아닌 주문 / 제한을 사용할 수 있습니다 당신은 당신의 데이터베이스에 따라 한 행에 결과를 제한하는 또 다른 키워드를해야 할 수도 있습니다. 데이터베이스는 MySQL을하지 않는 독점 세트를 반환하는 경우보다는 <와> 사이에 작동합니다.
-
==============================
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.모든 조상은에 의해 반환되는
모든 조상은에 의해 반환되는
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.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
from https://stackoverflow.com/questions/1602536/mysql-nested-sets-how-to-find-parent-of-node by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 동적 SQL와 열 이름을 통해 루핑 (0) | 2020.07.06 |
---|---|
[SQL] 때 데이터베이스 트리거의 나쁜입니까? [복제] (0) | 2020.07.06 |
[SQL] PostgreSQL의 행에 대한 열 헤더 전치 (0) | 2020.07.05 |
[SQL] TRY의 CATCH 안에 단일 문에서 여러 오류 메시지를 캡처 (0) | 2020.07.05 |
[SQL] LIMIT & IN / ALL / ANY / SOME 서브 쿼리에 문제가 (0) | 2020.07.05 |