2011-10-06 95 views
2

我对MySQL相对来说比较陌生,而且我对这部分内容感到厌烦。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 

拉动正确的信息,此查询结果,但如果有在博客上两点意见,它将显示博客和两遍,因为它是通过循环的意见。我想一次显示所有的博客信息,然后通过评论循环。

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

+0

好 - 只是存储当前博客的ID,并检查它的下一次迭代。如果它是相同的 - 不要输出它 – zerkms

+0

将查询分成两步怎么办?首先,你会得到博客数据,并在第二个博客的评论。 –

+0

我非常希望在一个查询中执行此操作。是否有可能尝试构建一个子查询?如果是这样,我怎么能在这里使用? – Yuschick

回答

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 
+0

11个查询,而不是1个或2个10个项目的页面** **差异很大 – zerkms

+0

11大于2,但在执行时间方面,它可能不会引起注意。 – Kibbee

+0

事实上,它不会适用于每天10个访问者的网站。 – zerkms

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 
} 

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

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大于零greather,分别选择意见和显示器。

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

0

有两个部分,你需要看看,一个是你的查询,另一个是你如何显示的东西。

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

您可以在谷歌铬市场搜索或通过下面的链接。

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

MYSQL query builder