我之前写了一个评论脚本,但它只是单线程的。我希望它能够多线程运行,但只是为了让用户回复评论,而不是回复评论的评论。因此,线程只会有两层。
目前,我在数据库中存储user_id
对应的comment_id
。
我能想到的唯一实现多线程评论的方法是,在评论表中添加一个parent
字段。但如果这样做,当我用PHP选择评论时,我将不得不针对每个评论执行另一个SELECT命令来选择评论的子级(如果有)。这似乎会给数据库带来很多负担。
肯定有更好的方法。有没有关于此的想法或教程?
我之前写了一个评论脚本,但它只是单线程的。我希望它能够多线程运行,但只是为了让用户回复评论,而不是回复评论的评论。因此,线程只会有两层。
目前,我在数据库中存储user_id
对应的comment_id
。
我能想到的唯一实现多线程评论的方法是,在评论表中添加一个parent
字段。但如果这样做,当我用PHP选择评论时,我将不得不针对每个评论执行另一个SELECT命令来选择评论的子级(如果有)。这似乎会给数据库带来很多负担。
肯定有更好的方法。有没有关于此的想法或教程?
有三(四)个备选方案:
使用递归查询来根据父 ID 选择所有评论。这在许多数据库产品中都得到了支持,语法取决于数据库类型。请查看文档以获取更多信息(搜索“递归”)。
如果在每个子评论中存储文章 ID,则可以通过一次常规的选择查询来选择具有相同文章 ID 的所有评论。您可以使用父 ID 将评论正确地显示在页面上,放置在正确的父级评论下面:
SELECT * FROM comments WHERE article_id = :article_id
如果你只需要两层评论,可以使用扩展的 where 来包含一级和二级评论:
SELECT * FROM comments
WHERE parent_id = :article_id
OR parent_id IN (SELECT id FROM comments WHERE parent_id = :article_id)
也可以使用union all来组合两个具有相同列的查询,但由于我假设所有数据都来自同一张表,所以可能没有必要这样做(请参见上面扩展的where子句):SELECT * FROM comments WHERE parent_id = :article_id
UNION ALL
SELECT * FROM comments WHERE parent_id IN
(SELECT id FROM comments WHERE parent_id = :article_id)
就我个人而言,我会选择选项2,因为它简单(不需要奇怪的SQL结构),高效(只需1个查询)且灵活(支持任意层级的评论)。
只需要一个查询操作,你只需正确地将数据循环存储到数组中,然后循环遍历该数组并显示评论。
SELECT * FROM comment WHERE article_id = :article_id
。 - The NailSELECT * FROM comments WHERE root = 1234;
当您获取评论时,您可以编写PHP代码,根据parent
列将其处理为数组的数组(这就是@JanL答案中所提到的)。我在另一个Stack Overflow问题的答案中发布了执行此操作的代码,Convert flat array to the multi-dimentional。
这个查询可能适用于您(我不知道您的结构,所以我猜测了一下):
SELECT * FROM comments a
LEFT JOIN comments b ON a.comment_id = b.parent_coment_id
LEFT JOIN comments c ON b.comment_id = c.parent_coment_id
WHERE a.comment_id <> b.comment_id
AND a.comment_id <> c.comment_id
AND b.comment_id <> c.comment_id;