문제

MySQL의 상위 자식 모델에서 노드의 깊이를 어떻게 계산합니까?

무엇보다도 내 목록 (PHP로 코딩)에 들여 쓰기를 만들려면 깊이가 필요합니다.

도움이 되었습니까?

해결책 2

이것은 오래된 질문 일지 모르지만 몇 달 전에 해결책을 찾았다는 것을 다른 사람들에게 알리고 싶습니다. 나는 최근에 여기에 글을 썼다 : http://en.someotherdeveloper.com/articles/adjacency-list-model-with-depth-calculation/

다른 팁

이는 데이터베이스에서 계층 구조의 실제 구현에 따라 다릅니다. 중첩 세트 모델을 사용하는 경우 (http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/) 단일 선택을 통해 전체 부모 대 중식 경로를 검색 할 수 있습니다.

업데이트: 알겠습니다. 인접력 목록 모델을 사용하므로 테이블에 노드 레벨을 저장하는 것이 좋습니다. 한 쿼리에서 노드 깊이를 줄뿐만 아니라 한 쿼리에서 해당 노드의 전체 경로를 검색 할 수 있습니다 (쿼리가 동적으로 생성되어야하지만).

SELECT n1.name AS lvl1, n2.name as lvl2, n3.name as lvl3, ..., nN.name as lvlN
  FROM nodes AS n1
  JOIN nodes AS n2 ON n2.parent_id = n1.id
  JOIN nodes AS n3 ON n3.parent_id = n2.id
  ...
  JOIN nodes AS nN ON nN.parent_id = n(N-1).id
WHERE nN.id = myChildNode;

노드가 레벨 N에 있다는 것을 알고 있으므로 왼쪽 조인이 필요하지 않으며 ID / Parent_id에 적절한 인덱스가 주어지면 합리적으로 빠릅니다.
이 접근법의 단점은 노드 이동 중에 노드 레벨을 업데이트해야하지만 노드 자체와 그 어린이를 위해서만 할 수있는 것처럼 합리적으로 간단하고 빠르야한다는 것입니다. 당신은 중첩 된 세트로 할 것입니다.

여기에 붙여 넣기를 복사하려면 여기에 내 예가 있습니다. ID와 Parent_ID가 제출 한 테이블 프로젝트가 있습니다.

DELIMITER $$
DROP FUNCTION IF EXISTS `getDepth` $$
CREATE FUNCTION `getDepth` (project_id INT) RETURNS int
BEGIN
    DECLARE depth INT;
    SET depth=1;

    WHILE project_id > 0 DO
        SELECT IFNULL(parent_id,-1) 
        INTO project_id 
        FROM ( SELECT parent_id FROM Projects WHERE id = project_id) t;

        IF project_id > 0 THEN
            SET depth = depth + 1;
        END IF;

    END WHILE;

    RETURN depth;

END $$
DELIMITER ;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top