是否可以通过一个SQL查询打印出(PHP)我的所有博客文章+相关评论?
若然,怎么样?
我在想这个方向:
SELECT p.post_id, p.title, c.comment_body
FROM posts p
LEFT JOIN comments c
ON c.parent_id = p.post_id
但这并没有像我预期的那样成功
答案 0 :(得分:4)
使用一个SQL查询不是很方便,因为您有1个帖子和多个评论 将帖子详细信息添加到每个评论(在组合查询中)是浪费资源。
获取帖子详细信息并使用帖子的post_id
查找属于该帖子的评论会更方便。
答案 1 :(得分:0)
我能想到的最简单的方法是迭代返回的所有行,并将它们分组到一个关联数组中,其中键是帖子ID。然后,您可以遍历该关联数组并打印每个帖子的评论,从该组的第一行获取帖子标题。
答案 2 :(得分:0)
获取数据时只需使用以下字段名称: $ result = mysql_query(“SELECT p.post_id,p.title,c.comment_body FROM posts p LEFT JOIN comments c ON c.parent_id = p.post_id”);
while($row = mysql_fetch_array($result))
{
echo $row['title'] . " " . $row['comment_body'];
echo "<br />";
}
答案 3 :(得分:0)
如果您使用的是MySQL,可以使用GROUP_CONCAT功能:
SELECT p.post_id, p.title, GROUP_CONCAT(c.comment_body)
FROM posts
LEFT JOIN comments c ON c.parent_id = p.post_id
GROUP BY p.post_id
答案 4 :(得分:0)
对于MySQL:
SELECT p.post_id, p.title, GROUP_CONCAT(c.comment_body), count(*) as coment_cnt
FROM
posts p
LEFT JOIN comments c ON (p.post_id = c.parent_id)
GROUP BY
p.post_id
答案 5 :(得分:0)
“但这并没有像我预期的那样有效”
...但你没有说出你所期待的。
假设您的查询中隐含的架构是正确的,那么只需要显示一次帖子就可以了:
$lastpostid=false;
while ($r=mysql_fetch_assoc($result)) {
if ($r['post_id']!=$lastpost) {
print "Post: " . $r['title'] . "<br />\n";
$comment_id=1;
$lastpost=$r['post_id'];
}
print "Comment # $comment_id : " . $r['comment_body'] . "<br />\n";
$comment_id++;
}
但正如我所说,这意味着你的查询是正确的(即评论不是分层的)。
下进行。