Php MySQL连接返回的行太多

Php MySQL连接返回的行太多,php,mysql,inner-join,Php,Mysql,Inner Join,我对MySQL还比较陌生,这一部分让我感到困惑 我正在构建一个简单的博客页面,该页面将显示一个博客以及与之相关的评论。我目前有两个表来处理这些数据: 博客 评论 .comment_id (primary), .blog_id, .comment_name, .comment 我试图做的是拉一个特定的博客,它匹配一个ID,并拉评论绑定到该博客。我的问题是: SELECT * FROM blogs JOIN comments ON blogs.blog_id=comments.blog_id WH

我对MySQL还比较陌生,这一部分让我感到困惑

我正在构建一个简单的博客页面,该页面将显示一个博客以及与之相关的评论。我目前有两个表来处理这些数据:

博客

评论

.comment_id (primary), .blog_id, .comment_name, .comment
我试图做的是拉一个特定的博客,它匹配一个ID,并拉评论绑定到该博客。我的问题是:

SELECT * FROM blogs JOIN comments ON blogs.blog_id=comments.blog_id WHERE blogs.blog_id = $active ORDER BY comments.comment_id
这个查询的结果是获取正确的信息,但如果博客上有两条评论,它将在循环浏览评论时两次显示博客和所有内容。我想显示所有的博客信息一次,然后让它在评论中循环


我希望我能解释清楚。任何帮助都会很棒。谢谢。

您描述的行为是连接应该做的。如果每个博客条目只需要一条记录,那么需要使用GROUPBY。要获取包含评论数的所有博客记录的列表,您可以执行如下查询:

SELECT blogs.*,Count(comments.comment_ID) 
FROM blogs 
LEFT JOIN comments 
ON blogs.blog_id=comments.blog_id WHERE blogs.blog_id = $active 
ORDER BY comments.comment_id
GROUP By Blog.BlogID
但是,您说过只想显示博客,然后显示与该博客相关的评论。在这种情况下,您很可能只需要使用一个初始查询来获取所有博客,然后在遍历所有博客条目以获取每个博客的评论时使用另一个查询。下面是一些伪代码

select * FROM blogs

For each record from above
    Code for displaying blog goes here

    Select * FROM Comments where Blog_id = $blogID

    For each comment from above query
        code for displaying comment goes here

    Next COmment

Next Blog
您可以只对所有注释进行一次选择,这样会更有效,但会使生成的代码更复杂,因为您必须使用php在生成的列表中查找记录。只使用多个查询要简单得多,对于大多数博客(一页最多10篇文章)来说,这并没有多大区别。如果您真的想使用一个查询,您可以按照下面的伪代码构造您的程序

SELECT * FROM blogs 
LEFT JOIN comments ON blogs.blog_id=comments.blog_id 
WHERE blogs.blog_id = $active ORDER BY blogs.blog_id, comments.comment_id

$LastBlogID = -1

FOR EACH Record
    If $LastBlogID != record['blog_id']
        Display Blog Information
        $LastBlogID = record['blog_id']
    End If

    Display Comment Information
Next Record

有两种方法可以实现这一点:

如果您确实需要在一个查询中执行此操作,请使用联接的SQL并使用博客ID作为唯一键对结果进行迭代:

$blogId = 0;
while ( null != ($row = mysql_fetch_assoc( $result ) ) )
{
  if ( $row['blog_id'] != $blogId )
  {
     // Display blog contents here
     $blogId = $row['blog_id'];
  }
  // Print coment
}
更有效的方法是将其作为两个查询运行。首先选择博客信息,并列出帖子数量:

SELECT blog_id, blog_title, blog_date, blog_post, COUNT(*) as comment_count
FROM blogs INNER JOIN comments ON blogs.blog_id = comments.blog_id
WHERE blog_id = $blogId
GROUP BY blog_id, blog_title, blog_date, blog_post;
或者,使用子选择:

SELECT blog_id, blog_title, blog_date,
    (SELECT COUNT(*) FROM comments WHERE blog_id = blog.blog_id) as comment_count
FROM blogs
WHERE blog_id = $blogId
  • 仅当注释计数大于零时,单独选择注释并显示

更不用说有各种各样的博客观点;在索引页上,第二个查询是您获取博客摘要和每篇文章评论数所需的全部内容,而无需显示每篇评论的内容。

您需要查看两个部分,一个是您的查询,另一个是如何显示内容

我刚刚找到了一些简单的工具来构建MYSQL查询并分析you查询,您甚至可以将数据库与网站连接起来

你可以在谷歌chrome市场上搜索,也可以通过下面的链接

我只是给出一个建议和方向,而不是实际解决它


好吧-只需存储当前博客的id,并在下一次迭代中检查它即可。如果是相同的-不输出,那么将查询分为两个步骤如何?第一个是博客数据,第二个是该博客的所有评论。我希望在一个查询中就可以做到这一点。是否可以尝试构造一个子…呃..嵌套查询?如果是这样的话,我怎么能在这里使用它呢?对于10个项目页面,11个查询而不是1个或2个查询有很大的不同。11个查询大于2个,但就执行时间而言,它可能不会很明显。事实上,对于每天10个访问者的站点来说,它不会。
SELECT blog_id, blog_title, blog_date,
    (SELECT COUNT(*) FROM comments WHERE blog_id = blog.blog_id) as comment_count
FROM blogs
WHERE blog_id = $blogId