Как построить Threaded комментарии с 1 или 2 запросами?

Может ли кто-нибудь предложить креативную структуру базы данных + алгоритм выборки для потоковой системы комментариев, которая будет выводить х количество потоков на страницу (с неограниченными ответами для каждого)?

Я могу запустить запрос, чтобы получить потоки, и в каждом экземпляре цикла запустите другой запрос, чтобы откликнуться на ответы …. но это плохая идея.

    Если вам нужны только 2 уровня, вот один способ с одним запросом:

    Таблица tableid, parent_id, comment

    Код

     $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 вас будут все ваши основные потоки и $threads[$id]['replies'] содержит все ответы. Потоки отсортированы – сначала = сначала, добавьте пейджинг, и вам хорошо идти.

    Добавьте в таблицу комментариев два столбца: parentCommentId и rootCommentId.

    parentCommentId – это идентификатор родительского комментария, а rootCommentId – это идентификатор комментария, который запустил этот поток.

    Чтобы отобразить N потоков, вам понадобятся два запроса:

    1. Получите N строк из таблицы комментариев, где rootCommentId = id
    2. Получить все комментарии для этих N потоков

    (Вы можете объединить эти два в один запрос GroupBy.)

    Это похоже на то, что я использую сейчас. Единственная сложная часть – вычисление следующего пути ответа для вставки, когда кто-то отвечает на комментарий.

    Данные примера

     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 

    Чтобы ответить на 01_01

     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;