2012-03-15 121 views
3

因此,我正在一個網站上有很多多對多的數據庫關係,並且因爲我對查詢關係數據庫還有點新意,所以我掙扎了一下。所以我有幾個表,我試圖從中獲取相關數據。我不打算進入整個數據庫,因爲它非常大,我試圖獲得所有特定用戶職位上的評論數量以及發佈後的喜歡數量,以及我要去的方式它是使用LEFT JOIN像這樣多個左連接與多個COUNT()

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 

但我遇到的問題是,如果有任何意見或不喜歡,如果有一個像或評論它,這將返回一個錯誤,除了將返回兩個字段中的最高數字,例如,如果在帖子上有3條評論,並且1條也會在類似字段中返回3條,因爲它正在計算它所返回的行數。所以我的問題是我如何才能真正獲得喜歡和評論的真實數量並放入該字段中,並且如果沒有錯誤而不是返回0,則返回0。

+0

您使用的是GROUP BY子句嗎?一般而言,您希望使用GROUP BY與COUNT()等任何聚合。 – 2012-03-15 17:48:09

回答

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

非常感謝你的回答。這工作很好。我想知道一些功能是什麼意思?有沒有一本書或一個網站,你可以推薦我學習這一點,更先進的查詢技術?並再次感謝你的幫助。 – 2012-03-16 15:06:34

+1

如果您主要使用MySQL,那麼我會閱讀文檔以瞭解所有可用功能,因爲每個db平臺都有自己的變體/增強功能。大多數情況下,連接和聚合在各個平臺上以相似的方式工作。例如,[COALESCE](http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_coalesce)返回給定列表中的第一個非空參數。在SQL Server中,你可以使用'ISNULL'來代替。 – RedFilter 2012-03-16 15:11:27

-1

您必須重命名具有計數()列這樣

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 
2

而不是使用計數()的你的結果,你可以有一個返回計數嵌套查詢:

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