2009-09-18 1 views
1

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

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

ответ

1

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

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

Для отображения N потоков, вам нужны два запрос:

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

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

3

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

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

+1

Как бы ограничить этот запрос до 10 сообщений (в том числе их ответов)? Используя «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 

В Примере РНР

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;