如何将查询排除在外,而我们却在其中?

时间:2013-01-13 18:55:30

标签: php mysql

我应该在帖子正文中显示评论数字。但是帖子的身体在那里,如果我在页面上放置评论num查询,而且要沉重!

我正在尝试做什么但没有工作:

$comments_data = mysql_query("SELECT * FROM `comments` WHERE `blogid`='$bid' AND `postid`='$postid'") or die(mysql_error());
$coments_num = mysql_num_rows($comments_data);

if($post_query) {
    while($post_data = mysql_fetch_array($post_query)) {
        $postid = $post_data['id'];
        $post_temp = $post;
        $post_temp = str_replace('[post_comments]',$coments_num,$post_temp);
        $posts .= $post_temp;
    }
}

但如果我这样使用会起作用:(但有很多疑问!)

if($post_query) {
    while($post_data = mysql_fetch_array($post_query)) {
        $postid = $post_data['id'];
        $comments_data = mysql_query("SELECT * FROM `comments` WHERE `blogid`='$bid' AND `postid`='$postid'") or die(mysql_error());
        $coments_num = mysql_num_rows($comments_data);
        $post_temp = $post;
        $post_temp = str_replace('[post_comments]',$coments_num,$post_temp);
        $posts .= $post_temp;
    }
}

2 个答案:

答案 0 :(得分:1)

如果您只需要帖子中的评论数量,而不是评论内容。然后在连接查询中使用COUNT子句:

$post_query = "SELECT *, COUNT(comment.id) AS comment_num 
FROM post JOIN comment ON comment.post_id = post.id
GROUP BY post.id;"

if($post_query) {
  while($post_data = mysql_fetch_array($post_query)) {
    $postid = $post_data['id'];
    $comment_num = $post_data['comment_num'];
    $post_temp = $post;
    $posts .= $post_temp;
  }
}

检查Working Demo

答案 1 :(得分:1)

应该很少必须从循环内查询数据库:通常可以构造一个返回所有所需结果的查询,然后遍历该结果集 - 这几乎总能提高性能

不是使用一个查询获取帖子,循环遍历该结果集并使用另一个查询获取每个帖子的评论,而是将表连接在一起;不知道你的架构或看到你的$post_query的SQL是不可能确定的,但你可能想要这样的东西:

SELECT   *
FROM     posts LEFT JOIN comments USING (postid)
WHERE    blogid = '$bid'
ORDER BY postid

然后循环搜索结果,通过检查postid列来检测您何时遇到新帖子。