我在这里和其他地方已经阅读了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查询)
并且如果true,则将$comments调整为等于$reply,以便我的嵌套注释被WordPress正确回显.然后我将$comments的值返回到它的原始值并退出我的嵌套注释循环回到主FOREACH.
在我的推理或执行中可能存在缺陷,但它的作用就像一个魅力!当然,这并没有提供额外的嵌套级别,并且所有嵌套的注释都是一个接一个地写入的,即使它们是相互回复的,但这对我来说已经足够了!
对于演示,http://www.vincentmounier.com/blog2/并点击帖子底部的任何“显示评论”链接. Nupul,再次感谢你的动力!