用于对评论及其嵌套回复进行排序的 MySQL 查询

标签 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 完好无损?

最佳答案

好吧,我终于弄明白了,部分要归功于上面 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->comment_parent == $comment->comment_ID(比较我的 2 个 MySQL 查询)

如果为真,则将 $comments 调整为等于 $replies,以便 WordPress 正确回应我的嵌套评论。然后我将 $comments 的值返回到它的原始值并退出我的嵌套评论循环回到主 FOREACH。

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

演示,http://www.vincentmounier.com/blog2/并单击帖子底部的任何“显示评论”链接。 Nupul,再次感谢您的鼓励!

关于用于对评论及其嵌套回复进行排序的 MySQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5874263/

相关文章:

c# - .NET Core 2.1 Identity 获取所有用户及其相关角色

php - 混合来自 2 个不同表的数据库结果

php - 如何使用 CodeIgniter 解决日期范围搜索

c++ - 排序一个vector,然后放入AVL树,还是直接输入哪个更快?

javascript - 递归选择排序(JS)

vba - Excel VBA : sorting a table featuring cells with drop-down lists

java - Eclipse Javadoc 评论不起作用

javascript - 禁用相似下拉列表之间的选定选项

javascript - 这段 IE 特定代码的作用是什么?

git - git 可以忽略特定的注释调试代码吗?