如何建立与1或2查询螺纹评论?(How to build Threaded comments wit

2019-08-07 14:40发布

任何人都可以提出一个创造性的数据库结构+算法取一个线程评论系统,线程每页(为每个无限回复)的那会输出x量?

我可以运行一个查询来获取线程,在一个循环中的每个实例,运行另一个查询呼应了答复....但是这是一个坏主意。

Answer 1:

如果你只需要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']持有的所有答复。 该线程进行排序 - 最新=第一,增加一些寻呼和你去好。



Answer 2:

添加两列的评语表:parentCommentId和rootCommentId。

parentCommentId是父评论的ID,并rootCommentId是发起的主题评论的ID。

为了显示N个线程,则需要两个查询:

  1. 从评语表,其中rootCommentId = ID获取N行
  2. 获取这些N个线程所有评论

(您可以将这两个合并成一个单一的GroupBy查询。)



Answer 3:

这与我现在使用的东西。 唯一棘手的部分是计算的下一个回复路径当有人回复评论插入。

示例数据

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;


文章来源: How to build Threaded comments with a 1 or 2 queries?