MySQL Join返回太多行


MySQL Join Returns too many Rows

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

该查询的结果是提取正确的信息,但如果博客上有两条评论,它将在遍历评论时显示博客和所有内容两次。我想一次显示所有的博客信息,然后让它循环遍历评论。

我希望我解释清楚了。任何帮助都太好了。谢谢你。

您所描述的行为就是连接应该做的事情。如果每个博客条目只需要一条记录,则需要使用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

有两种方法:

如果您绝对需要在一个查询中执行此操作,请使用join 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大于0时,单独选择注释并显示

更不用说有不同种类的博客视图;在索引页面上,第二个查询将是提取博客摘要和每篇文章的评论数所需的全部内容,而不需要显示每个评论的内容。

你需要研究两个部分,一个是你的查询,另一个是你如何显示这些东西。

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

你可以在google chrome市场搜索或通过下面的链接。

我只是给一个建议和指导,而不是实际解决问题。

MYSQL查询生成器