Может ли кто-нибудь предложить креативную структуру базы данных + алгоритм выборки для потоковой системы комментариев, которая будет выводить х количество потоков на страницу (с неограниченными ответами для каждого)?
Я могу запустить запрос, чтобы получить потоки, и в каждом экземпляре цикла запустите другой запрос, чтобы откликнуться на ответы …. но это плохая идея.
Если вам нужны только 2 уровня, вот один способ с одним запросом:
Таблица table – 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']
содержит все ответы. Потоки отсортированы – сначала = сначала, добавьте пейджинг, и вам хорошо идти.
Добавьте в таблицу комментариев два столбца: parentCommentId и rootCommentId.
parentCommentId – это идентификатор родительского комментария, а rootCommentId – это идентификатор комментария, который запустил этот поток.
Чтобы отобразить 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;