繁体   English   中英

如何仅通过一个SQL查询打印帖子和评论

[英]How to print posts and comments with only one sql query

是否可以通过一个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

但这并没有达到我的预期

使用一个SQL查询不是很方便,因为您有1条帖子和多个注释。
将帖子详细信息添加到每个评论(在组合查询中)会浪费资源。

获取帖子的详细信息并使用帖子的post_id查找属于该帖子的评论要方便得多。

如果您使用的是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

我能想到的最简单的方法是遍历所有返回的行,并将它们分组到一个关联数组中,其中键是帖子ID。 然后,您可以遍历该关联数组并为每个帖子打印注释,并从组的第一行中获取帖子标题。

当获取数据时,只需使用字段名称,例如:$ 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 />";
  }

来自: http : //www.tizag.com/mysqlTutorial/mysqljoins.php

对于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

“但是这并没有达到我的预期”

...但是您没有说出您的期望。

假设查询中的隐式架构是正确的,那么只显示帖子一次就可以了:

$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++;
}

但是正如我所说,这意味着您的查询是正确的(即注释不是分层的)。

C。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM