-1

我有一个评论发布系统,不同的用户可以在其中发布他们的评论。还有一个子评论功能,用户也可以在其中给出他们的子评论,就像他们一样,也可以删除它们。

我将所有评论和子评论存储在一个名为 main_reviews 的表中,该表有一个父 id 字段,通过它我可以检测哪个是评论,哪个是子评论。主评论的父 id 值为 0,而子评论的父 id 值为 id,它们是子评论。

因此,当我使用 php 函数 mysql_fetch_array() 在页面上显示所有评论和子评论时,我想使用一个查询来整理所有评论和子评论。我使用了以下查询:

mysql_query("select * from main_reviews where p_id=0 order by id desc");

这将显示所有正确的数据。但转折就在这里:我想对所有评论及其子评论进行排序,这意味着当用户发布子评论时,该特定子评论及其主要评论应该像 facebook 一样显示在顶部。

因此,无论是使用“union”还是“in”子句或其他任何内容,都必须生成什么查询,以便所有评论与其子评论一起排序,即使它们的子评论稍后发布。

很抱歉,如果有任何语法错误,因为我来自非英语国家。

4

4 回答 4

0

从结构的角度来看,最好不要在同一个表中包含注释和子注释。我会把它们分成两张桌子,所以你有类似的东西

Table comments
id (int,primary,auto increment)
body (text)
date (datetime)

Table subcomments
id (int,primary,auto increment)
comment_id (int,foreign key)
body (text)
date (datetime)

使用这种结构,您可以简单地触发查询以获取评论和相应的子评论。想象一下,您有一条 id 为 1 的评论,只需使用

$query="SELECT * FROM subcomments WHERE comment_id=1 ORDER BY date DESC";
$result=mysql_query($query);

ORDER BY date DESC首先为您提供最新的子评论。

要一次获取所有评论和子评论,请使用类似

SELECT * FROM comments,subcomments WHERE comments.id=subcomments.comment_id ORDER BY comments.date,subcomments.date
于 2012-07-24T08:23:27.073 回答
0

我能想到在一个查询中执行此操作的唯一方法是让所有评论的 parent_id 都有自己的 id 而不是 0(可能将其重命名为 comment_id 或其他东西),然后按 parent_id 排序,然后按日期。它不是很规范化,但这样你就可以在一个查询中做到这一点。

于 2012-07-24T08:30:46.217 回答
0

我相信您最好的选择是两个查询(假设您只能回复顶级评论)。

获取评论

SELECT * FROM comments WHERE parent_id = 0 ORDER BY date DESC

获取子评论:

SELECT * FROM WHERE parent_id <> 0 ORDER BY parent_id ASC, DATE DESC

然后,您可以在 PHP 中轻松关联子注释。

另一方面,我会用它NULL来表示没有父帖子,而不是0.

于 2012-07-24T08:35:06.307 回答
0

如果我理解正确,您会遇到这样的情况:您有许多带有发布日期的子评论,您需要这些子评论来订购您的数据。您需要某些订单的最新发布日期(无论是主发布还是子发布的发布日期)。

(简写:maincomment = mc,subcomment = sc,mcid=is of mc,scid=id of sc)

现在像这样重组你的结果集:

$mc = array();
// Loop over resultset here
foreach ($resultset as $onecomment){
 $mcid = ..(fetch from id or parentid from $onecomment)..
 if (..is_subcomment..){
   // put in subcomment of the right mc
   $mc[$mcid]["subcomment"][] = $onecomment;
 } else {
   // this is a maincommant
   $mc[$mcid] = $onecomment;
 }
 // And ALWAYS store the postdate, be it from the subcomment, of maincomment,
 // but only if it is later than the current
 if (!isset($mc[$mcid]["lastpostdate"])){
    // first, always store
    $mc[$mcid]["lastpostdate"] =  $onecomment["postdate"];
 } else {
    // Only store if this one is bigger
    if (strtotime($onecomment["postdate"]) > strtotime($mc[$mcid]["lastpostdate"])){
         // overwrite
         $mc[$mcid]["lastpostdate"] =  $onecomment["postdate"];
    }
 }
}

现在您已经存储了每个发布的最后一个发布日期。现在您可以使用 $mc[$mcid]["lastpostdate"] 在 lastpostdate 对您的数组进行排序。这种重组的总体思路是将基本信息(后日期)链接到数组的主条目。

于 2012-07-24T08:35:39.473 回答