在查询的第一行获得错误的结果

时间:2013-10-21 16:52:46

标签: mysql sql left-join

我正在使用mysql,我的查询几乎完美无缺。 我有以下三个表:

文章

  
      
  • 的article_id
  •   

注释

  
      
  • COMMENT_ID
  •   
  • 的article_id
  •   

查看

  
      
  • 的view_id
  •   
  • 的article_id
  •   

我希望将所有这些信息放在一个查询中。我想看看每篇文章有多少观点和评论。 我今天已经成功地在一些伟大的人的帮助下制造了一个,但我又被卡住了。

SELECT article.id_article,
       COUNT(view.id_article),
       COUNT(comment.id_article) 
FROM article LEFT JOIN view ON article.id_article = view.id_article 
             LEFT JOIN comment ON article.id_article = comment.id_article 
GROUP BY id_article 
ORDER BY id_article

结果是,只有第一行显示错误的结果。而不是4条评论和3条观点,我看到两者都有24条,不知道为什么,因为其余的都很好。似乎评论的数量是一式四份,并在评论和观点的第一行中再现。

1 个答案:

答案 0 :(得分:1)

您正在通过加入获得笛卡尔产品:

1条* 4次观看* 3条评论= 12

不确定为什么你得到24,可能你有2篇文章第一行有相同的ID。

SELECT article.id_article,
       COUNT(distinct view.id_view),
       COUNT(distinct comment.id_comment) 
FROM article LEFT JOIN view ON article.id_article = view.id_article 
             LEFT JOIN comment ON article.id_article = comment.id_article 
GROUP BY id_article 
ORDER BY id_article

编写此查询的另一种方法可以是:

   SELECT article.id_article,
          v.n_views,
          c.n_comments
     FROM article 
LEFT JOIN (SELECT article_id,
                  count(*) n_views
             FROM view 
         GROUP BY article_id) v ON article.id_article = v.id_article 
LEFT JOIN (SELECT article_id,
                  count(*) n_comments
             FROM comment 
         GROUP BY article_id) c ON article.id_article = c.id_article 
    GROUP BY id_article 
    ORDER BY id_article