MySQL Join返回太多行

时间:2011-10-06 00:18:09

标签: php mysql inner-join

我对MySQL比较陌生,我对这部分感到困惑。

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

博客

.blog_id (primary), .blog_title, .blog_date, .blog_post

评论

.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

此查询会导致提取正确的信息,但如果博客上有两条评论,则会在循环浏览评论时显示博客和所有内容。我希望一次显示所有博客信息,然后循环浏览评论。

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

3 个答案:

答案 0 :(得分:3)

您描述的行为是连接应该执行的操作。如果您只想为每个博客条目创建1条记录,则需要使用group by。要获取包含评论数量的所有博客记录的列表,您可以执行以下查询:

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

答案 1 :(得分:0)

有两种方法可以解决这个问题:

如果您绝对需要在一个查询中执行此操作,请使用您加入的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
}

更有效的方法是将其作为两个查询运行。首先选择博客信息,计数为POSTS:

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
  • 仅当comment_count大于零时,单独选择注释并显示。

更不用说有不同类型的博客观点;在索引页面上,第二个查询将是您在每个帖子上提取博客摘要和评论计数所需的全部内容,而无需显示每条评论的内容。

答案 2 :(得分:0)

您需要查看两个部分,一个是您的查询,另一个是您展示事物的方式。

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

您可以在谷歌浏览器市场搜索或通过以下链接进行搜索。

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

MYSQL query builder