복붙노트

[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. ==============================

    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. ==============================

    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)
    

    예를 들면

  3. from https://stackoverflow.com/questions/7569399/get-a-recursive-parent-list by cc-by-sa and MIT license