[SQL] 재귀 적 부모 목록을
SQL재귀 적 부모 목록을
MySQL을 사용,이 같은 필드 구조를 가지고 테이블에서, 부모의 목록을 반환합니다. ID, PARENTID, NAME (표준 부모 - 자식 계층). 나는 모든 '부모'의 목록을 반환하는 나무 "까지"통과하고 싶습니다.
나는 "중첩 된 세트"이 처리하는 더 좋은 방법이 될 수 실현 -하지만 현재 나는 데이터의 구조를 변경할 수 없습니다. 나는 미래에 그렇게 보일 것이다. 현재 - 데이터의 나의 세트는 현실적으로 깊이의 몇 가지 수준을 포함하지 않습니다 - 미친 아무것도 ... 어쩌면 2-5을 내 재귀 히트 '너무 비싸'가 될해서는 안.
나는 SQL 서버 가져 오기 상위 목록에 제시된 솔루션을 검토 한 - MySQL의에서하지만,이 구문 폭탄 ...
사람이 작업을 수행하는 방법의 예를 가지고 있습니까?
@kevin - 링크에 대한 THX -하지만, 난 여전히 오류가 발생합니다. ( "모든 파생 테이블은 자신의 별명을 가지고 있어야합니다")
여기에 내가 무슨 짓을했는지 (제 위의 수정 구문 형태는 - '적합'MySQL로) -의 나는 분명 뭔가를 놓친 ...
SELECT parents.*
FROM (
SELECT taskID, task, parentID, 0 as level
FROM tasks
WHERE taskidID = 9147
UNION ALL
SELECT taskID, task, parentID, Level + 1
FROM tasks
WHERE taskID = (SELECT parentID FROM parents ORDER BY level DESC LIMIT 1)
)
생각 ???
예:
ID PARENTID NAME
9146 0 thing1
9147 0 thing2
9148 9146 thing3
9149 9148 thing4
9150 0 thing5
9151 9149 thing6
"thing3"의 부모를위한 쿼리 반환 "9148,9146"
"thing6"의 부모를위한 쿼리 반환 "9149,9148,9146,0"
해결법
-
==============================
1.이 예에서 우리는 5 단계를 확인하고 있습니다 :
이 예에서 우리는 5 단계를 확인하고 있습니다 :
select t1.parentid, t2.parentid, t3.parentid, t4.parentid, t5.parentid from tableName t1 left join tableName t2 on t1.parentid = t2.id left join tableName t3 on t2.parentid = t3.id left join tableName t4 on t3.parentid = t4.id left join tableName t5 on t4.parentid = t5.id where t1.name = 'thing3'
-
==============================
2.여기에, 나는 내 데이터베이스 (MAMP)에서 그것을 확인, 당신을 위해 약간의 기능을 만들어 그것을 잘 작동합니다
여기에, 나는 내 데이터베이스 (MAMP)에서 그것을 확인, 당신을 위해 약간의 기능을 만들어 그것을 잘 작동합니다
use mySchema; drop procedure if exists getParents; DELIMITER $$ CREATE PROCEDURE getParents (in_ID int) BEGIN DROP TEMPORARY TABLE IF EXISTS results; DROP TEMPORARY TABLE IF EXISTS temp2; DROP TEMPORARY TABLE IF EXISTS temp1; CREATE TEMPORARY TABLE temp1 AS select distinct ID, parentID from tasks where parentID = in_ID; create TEMPORARY table results AS Select ID, parentID from temp1; WHILE (select count(*) from temp1) DO create TEMPORARY table temp2 as select distinct ID, parentID from tasks where parentID in (select ID from temp1); insert into results select ID, parentID from temp2; drop TEMPORARY table if exists temp1; create TEMPORARY table temp1 AS select ID, parentID from temp2; drop TEMPORARY table if exists temp2; END WHILE; select * from results; DROP TEMPORARY TABLE IF EXISTS results; DROP TEMPORARY TABLE IF EXISTS temp1; END $$ DELIMITER ;
이 코드는 어떤 깊이로 모든 부모를 반환합니다. 당신은 분명히 결과에 추가 필드를 추가 할 수 있습니다
이처럼 사용
call getParents(9148)
예를 들면
from https://stackoverflow.com/questions/7569399/get-a-recursive-parent-list by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 분할 쉼표에서는 SQL 서버에 복수의 열을 열 값을 구분 (0) | 2020.05.26 |
---|---|
[SQL] 여러 테이블에서 행을 삭제 MYSQL (0) | 2020.05.26 |
[SQL] ALTER 테이블 - MySQL의에서 AUTO_INCREMENT를 추가 (0) | 2020.05.26 |
[SQL] 오라클 / SQL : - 리턴 제로 행 왜 쿼리 "WHERE ROWNUM> = 5 AND ROWNUM <= 10 기록 SELECT * FROM"않습니다 (0) | 2020.05.26 |
[SQL] 다른 테이블의 데이터를 사용하여 계산 된 열 만들기 (0) | 2020.05.26 |