【问题标题】:multiple LEFT JOINS with multiple COUNT()具有多个 COUNT() 的多个 LEFT JOINS
【发布时间】:2012-04-01 06:45:34
【问题描述】:

所以我在一个有很多多对多数据库关系的网站上工作,因为我对查询关系数据库还是有点陌生​​,所以我有点挣扎。所以我有几个表,我试图从中获取相关数据。我不打算进入整个数据库,因为它非常大,我试图获取所有特定用户帖子的 cmets 数量以及该帖子的喜欢数量,以及我的方式关于它使用的是这样的 LEFT JOIN

  SELECT Post.idPosts, Post.Title, Post.Date_poste,
  COUNT(Post_has_Comments.Post_idPost), 
  COUNT(Post_has_Likes.Post_idStories)
  FROM Post
  LEFT JOIN Post_has_Comments ON Post.idPost = S    
Post_has_Comments.Post_idStories
LEFT JOIN Post_has_Likes ON Post.idPost = Post_has_Likes.Post_idStories
WHERE Post.idUsers  =  1

但是我遇到的问题是,如果没有 cmets 或没有喜欢,这将返回错误,此外,如果有喜欢或评论,它将返回两个字段中的最高数字,例如,如果有一个帖子上有 3 个 cmets,而 1 个喜欢它也会在 like 字段中返回 3 个,因为我猜它正在计算它返回的行数。所以我的问题是我如何真正获得喜欢和 cmets 的真实数量并放入该字段,如果没有,则返回 0 而不是错误?

【问题讨论】:

  • 您使用的是 GROUP BY 子句吗?通常,您希望将 GROUP BY 与 COUNT() 等任何聚合一起使用。

标签: php mysql sql join


【解决方案1】:
SELECT Post.idPosts, Post.Title, Post.Date_poste,
    coalesce(cc.Count, 0) as CommentCount,
    coalesce(lc.Count, 0) as LikeCount
FROM Post p 
left outer join(
    select Post_idPost, count(*) as Count
    from Post_has_Comments
    group by Post_idPost
) cc on p.idPost = cc.Post_idPost
left outer join (
    select Post_idStories, count(*) as Count
    from Post_has_Likes
    group by Post_idStories
) lc on p.idPost = lc.Post_idStories
WHERE p.idUsers = 1

【讨论】:

  • 非常感谢您的回答。这很好用。我想知道一些功能是什么意思?有没有一本书或一个网站可以推荐给我来学习这个,更高级的查询技术?再次感谢您的帮助。
  • 如果您主要使用 MySQL,我会阅读文档以了解所有可用功能,因为每个 db 平台都有自己的变体/增强功能。在大多数情况下,连接和聚合在平台上的工作方式相似。例如,COALESCE 返回给定列表中的第一个非空参数。在 SQL Server 中,您可以改用 ISNULL
【解决方案2】:

您必须像这样重命名具有 count() 的列的结果

SELECT Post.idPosts, Post.Title, Post.Date_poste,
  COUNT(Post_has_Comments.Post_idPost) AS comments_count, 
  COUNT(Post_has_Likes.Post_idStories) AS likes_count
  FROM Post
  LEFT JOIN Post_has_Comments ON Post.idPost = S    
Post_has_Comments.Post_idStories
LEFT JOIN Post_has_Likes ON Post.idPost = Post_has_Likes.Post_idStories
WHERE Post.idUsers  =  1

【讨论】:

    【解决方案3】:

    你可以有一个返回计数的嵌套查询,而不是使用 count():

     SELECT Post.idPosts, Post.Title, Post.Date_poste,
      select COUNT(Post_idPost) from Post_has_Comments where Post_has_Comments.Post_idPost = Post.idPosts, 
      ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-25
      • 1970-01-01
      • 1970-01-01
      • 2020-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多