2011-09-25 2 views
1

계층 구조에 parent_id를 사용하는 공통 데이터베이스 구조가 있습니다.MySQL 및 PHP는 parent_id를 사용하여 계층 구조의 항목 깊이를 얻습니다.

항목의 깊이를 찾으려고합니다.

그래서 예를 들어이 걸릴 : 나는 ID 4 (3D)의 깊이를 발견하고 싶었다면, 대답은 3입니다

ID Name Parent_id 
1 Games 0 
2 Nintendo 1 
3 DS 2 
4 3D 3 

어떤 생각 나는이 또는 SQL의 조합을 조회 할 방법 및 PHP?

감사합니다.

+0

는 "깊이"가 무슨 뜻인지 확실하지? Parent_id를 가져오고 싶습니까? 아니면 우연히 같은 값입니까? –

답변

3

순진한 구현이 있습니까? 가장 좋은 방법을 찾고 있습니까? 나무는 재귀 적이므로 나무 높이만큼 db를 쿼리한다고 생각합니다.

당신의 세 가지가 균형을하지 않은 경우

function getHeigth($item_name) { 
    $res = 0; 
    $current_parent_id = executeSql("SELECT parent_id FROM games g WHERE g.name= ? " , $item_name); 
    while ($current_parent_id != 0) { 
     $current_parent_id = executeSql("SELECT parent_id FROM games g WHERE g.id = ? " , $current_parent_id); 
     $res = $res + 1; 
    } 
    return $res; 
} 

이 알고리즘은 나쁜 수행이 의사 PHP.

깊이를 저장하면 성능은 향상되지만 UPDATE 및 INSERT 쿼리에는 영향을줍니다. 당신의 나무가 파손되는 경우도

이 사이비 - PHP 수 루프 영원히

+3

그게 내가 "추한"이라고 부르는 것입니다. –

+0

이것은 그의 테이블로 문제를 해결할 수있는 순진한 방법입니다. 스키마에 높이를 추가하는 것이 더 좋습니다. 당신은 스키마를 변경하지 않고 문제를 해결하는 더 좋은 방법을 알고 있습니까? 보통 나무는 또한 비싸다, 그것은 테이블이 큰 경우 중요하지 않습니다. – llazzaro

+0

확실합니다. 그런 문제가있는 상황에 처하지 말라. –

1

깊이를 얻는 더 좋은 방법은 데이터와 함께 별도의 필드에 저장하는 것입니다.

중첩 된 세트 또는 구체화 된 경로와 같은 계층 적 데이터를 저장하는 좀 더 지능적인 방법을 사용하는 것이 훨씬 더 좋습니다.

현재 테이블 설정에서 깊이를 얻을 수 있지만 물론 가장 재밌는 방법 인 재귀입니다. 그러나 테이블이 비교적 작 으면 큰 문제는 아닙니다.

관련 문제