How to JOIN a COUNT from a table, and then effect that COUNT with another JOIN

前端 未结 3 2189
有刺的猬
有刺的猬 2021-02-13 16:52

I have three tables

Post

ID  Name
1   \'Something\'
2   \'Something else\'
3   \'One more\'

Comment

ID  PostId  Profile         


        
相关标签:
3条回答
  • 2021-02-13 17:32

    You could use a nested select like this:

    SELECT Post.Id, temp.Count
    FROM Post
    LEFT JOIN
    (SELECT Post.Id, COUNT(Comment.ID) AS Count
    FROM Post
    LEFT JOIN Comment ON Comment.PostId = Post.ID
    LEFT JOIN Profile ON Profile.ID = Comment.ProfileID
    WHERE Profile.Approved = 1
    GROUP BY Post.Id)
    temp ON temp.Id = Post.ID
    

    Which would give you null where there are no posts, rather than no record:

    1  1
    2  null
    3  1
    

    Just to improve on that, you could use an if to get rid of the nulls

    SELECT Post.Id, if(temp.Count >= 1,temp.Count,0) as newCount
    FROM Post
    LEFT JOIN
    (SELECT Post.Id, COUNT(Comment.ID) AS Count
    FROM Post
    LEFT JOIN Comment ON Comment.PostId = Post.ID
    LEFT JOIN Profile ON Profile.ID = Comment.ProfileID
    WHERE Profile.Approved = 1
    GROUP BY Post.Id) temp ON temp.Id = Post.ID
    

    Which gives you what you originally wanted:

    1  1
    2  0
    3  1
    

    Note: There is most probably a more elegant solution though!!!!

    0 讨论(0)
  • 2021-02-13 17:41

    From the definition of the COUNT function:

    The COUNT function will only count those records in which the field in the brackets is NOT NULL.

    This means that simple outer join like this would work:

    SELECT Post.ID, COUNT(Comment.ID)
      FROM Post LEFT JOIN Comment ON (Post.ID = Comment.PostId)
                LEFT JOIN Profile ON (Profile.ID = Comment.ProfileID AND
                                      Profile.Approved = 1)
     GROUP BY Post.ID
    
    0 讨论(0)
  • 2021-02-13 17:52
    SELECT Post.Id, COUNT(Comment.ID) AS Count
    FROM Post
    LEFT JOIN Comment ON Comment.PostId = Post.ID
    LEFT JOIN Profile ON Profile.ID = Comment.ProfileID
    WHERE Profile.Approved = 1
    GROUP BY Post.Id
    

    Probably you didn't paste it for the sake of the example, but you might evaluate to de-normalize the Profile table together with the Comment one, by moving the Approved column in it.

    0 讨论(0)
提交回复
热议问题