用于排序注释及其嵌套回复的MySQL查询

时间:2011-05-03 18:56:23

标签: mysql sorting comments nested

我在这里和其他地方已经阅读了10多篇相关帖子,但仍然无法解决这个问题,对于php和MySQL来说还是新手:

我正在使用WordPress并尝试在旧主题中实现嵌套注释。我的表已全部设置(让我们称之为'评论')并具有以下字段:

comment_ID | comment_date | comment_parent, etc.
顶级评论中

comment_parent 仍然等于0 ;它等于嵌套回复中回复的评论的 comment_ID

原始MySQL查询如下所示:

SELECT * FROM $wpdb->comments 
WHERE comment_post_ID = %d AND comment_approved = '1' 
ORDER BY comment_date ASC LIMIT %d"

通过后面的php并输出注释列表,注释按日期列出,不考虑嵌套回复:

comment_ID | comment_date | comment_parent
100          Jan 01         0      (this is a top level comment)
104          Jan 03         0      (this is a top level comment)
106          Jan 04         100    (this is a reply to the first comment)
108          Jan 05         104    (this is a reply to the second comment)

显然,由于我按日期排序,序列被打破了。评论106应出现在评论100的正下方,评论108应低于评论104。

我试图不改变我的PHP,我想用MySQL查询做到这一点,但无法做到正确。我尝试过在类似问题中使用JOIN,GROUP BY,HAVING,但没有任何成功。有没有办法让我从查询中获得正确的排序并保持我的PHP完好无损?

2 个答案:

答案 0 :(得分:4)

好吧,我终于想通了,部分归功于Nupul上面的评论,他说:“你可以先在第二轮获取所有顶级评论,然后在第二轮中获取嵌套评论(全部)并填充相应的内容。“我确实尝试过这个选项但未成功,但这促使我坚持不懈......

为了记录并希望将来可以帮助某人,这就是我如何修复它。 两个单独的MySQL查询首先获取顶级注释,其次,嵌套注释回复(这些查询的格式为WordPress。)

$comments = $wpdb->get_results($wpdb->prepare("
  SELECT * 
  FROM $wpdb->comments 
  WHERE comment_post_ID = %d AND comment_approved = '1' AND comment_parent = '0' 
  ORDER BY comment_date ASC 
  LIMIT %d
",etc,etc)); 

$replies = $wpdb->get_results($wpdb->prepare("
  SELECT * 
  FROM $wpdb->comments 
  WHERE comment_post_ID = %d AND comment_approved = '1' AND comment_parent <> '0' 
  ORDER BY comment_date ASC 
  LIMIT %d
",etc,etc));

然后我进入我的主评论循环(FOREACH),仅查找顶级评论。在该循环中,在底部,我跳转到嵌套的IF循环中寻找嵌套的注释

$ reply-&gt; comment_parent == $ comment-&gt; comment_ID (比较我的2个MySQL查询)

并且如果将 $ comments 调整为等于 $回复,则我的嵌套注释会被WordPress正确回显。然后我将 $ comments 的值返回到其原始值,并将我的嵌套注释循环退回到主FOREACH。

我的推理或执行可能存在缺陷,但它有点像魅力!当然,这不会提供额外的嵌套级别,并且所有嵌套的注释都是一个接一个地写入的,即使它们是相互回复的,但这对我来说已经足够了!

对于演示,http://www.vincentmounier.com/blog2/并点击帖子底部的任何“显示评论”链接。 Nupul,再次感谢你的动力!

答案 1 :(得分:3)

您可能最好更改表格设计。实现嵌套注释的更好方法之一是使用Modified Preorder Tree Traversal(MPTT)

This is an article about an MPTT menu,但您应该能够学习如何使用类似的方案实施评论系统。