2009-09-18 2 views
1

누구나 독창적 인 데이터베이스 구조 + 스레드 별 주석 시스템을위한 페칭 알고리즘을 제안 할 수 있습니다. 페이지 당 스레드 수가 x만큼 씩 출력됩니다 (각각에 무제한 응답이 가능)?1 또는 2 개의 쿼리로 스레드 주석을 작성하는 방법은 무엇입니까?

쿼리를 실행하여 스레드를 얻을 수 있으며 루프의 각 인스턴스에서 다른 쿼리를 실행하여 응답을 에코 할 수 있습니다.하지만 그 생각은 잘못되었습니다.

답변

1

댓글 테이블에 parentCommentId 및 rootCommentId라는 두 개의 열을 추가합니다.

parentCommentId는 상위 주석의 ID이고 rootCommentId는이 스레드를 시작한 주석의 ID입니다. rootCommentId = ID

  • 이 N 스레드
  • 에 대한 모든 의견을 얻을 경우 (주석 테이블에서

    1. 가져 N 행 :

      는 두 개의 쿼리가 필요합니다, N 스레드를 표시하려면 이 두 값을 하나의 GroupBy 쿼리로 결합 할 수 있습니다.

    3

    두 레벨 만 있으면 다음과 같은 쿼리를 사용할 수 있습니다.

    테이블-id, parent_id, comment$threads에서

    $rows = mysql_query(' 
        select * 
        FROM 
        comments 
        ORDER BY 
        id DESC'); 
    
    $threads = array(); 
    foreach($rows as $row) { 
        if($row['parent_id'] === '0') { 
        $threads[$row['id']] = array(
         'comment' => $row['comment'], 
         'replies' => array() 
        ); 
        } else { 
        $threads[$row['parent_id']]['replies'][] = $row['comment']; 
        } 
    } 
    

    당신이 당신의 주요 스레드를하고 $threads[$id]['replies']이 모든 답장을 보유하고

    코드입니다. 스레드가 정렬됩니다 - 최신 = 처음, 일부 페이징을 추가하고 당신은 좋은거야.

    +1

    을 01_01 할 수 있도록 결과? 'LIMIT 10'을 사용하면 10 행만 반환되며 부모 또는 자식인지 여부는 중요하지 않습니다. 이 경우 페이지 매김은 어떻게 작동합니까? 또한, 나는 파티에 늦었다는 것을 알고 있습니다.^ _^ – Bastien

    +0

    @Bastien이 설정으로 페이지 매김 또는 "추가 설명로드"방법을 알아 냈습니까? – Nathan

    -1

    이것은 지금 사용하고있는 것과 비슷합니다. 유일한 까다로운 부분은 누군가가 의견에 응답 할 때 삽입 할 다음 회신 경로를 계산하는 것입니다.

    예 데이터

    ID | Comment      | Path 
    ---+------------------------------+---------- 
    0 | Comment #1     | 01 
    1 | Comment #1 reply    | 01_01 
    2 | Comment #1 reply reply  | 01_01_01 
    3 | Comment #1 reply reply  | 01_01_02 
    4 | Comment #2     | 02 
    5 | Comment #3     | 03 
    6 | Comment #3 reply    | 03_01 
    

    예 SQL

    SELECT * FROM comments ORDER BY path 
    

    예 PHP

    while ($result = mysql_fetch_assoc($query)) { 
        $nesting_depth = count(explode("_", $result['path'])); 
        $branch = str_repeat("--", $nesting_depth); 
        echo $branch {$result['comment']}"; 
    } 
    

    예는

    Comment #1 
    -- Comment #1 reply 
    ---- Comment #1 reply reply 
    ---- Comment #1 reply reply 
    Comment #2 
    Comment #3 
    -- Comment #3 reply 
    

    가 (자신의 답변 포함) 응답이 10 개 개의 게시물이 쿼리를 제한 할 방법

    SELECT path FROM comments WHERE path LIKE '01\_01\___' 
    
    $last_path = $row[0]; 
    $last_path_suffix = substr($last_path,strrpos($last_path,'_')+1); 
    $next_path_suffix = str_pad($last_path_suffix+1,2,'0',STR_PAD_LEFT); 
    $next_path = substr($last_path,0,strlen($last_path)-strlen($last_path_suffix)).$next_path_suffix; 
    
    관련 문제