2017-10-08 136 views
1

我想要在一個查詢中的每個帖子的總喜歡和總數與聯接的幫助。獲得總帖子和與帖子的評論

我正在使用此查詢。但結果是錯誤的

SELECT blog.id, count(blog_comments.id) as likes , count(blog_likes.id) as comments 
FROM blog LEFT JOIN 
    blog_comments 
    ON blog.id = blog_comments.blog_id LEFT JOIN 
    blog_likes 
    ON blog.id = blog_likes.blog_id 
GROUP BY blog.id 

請查看圖像的表結構:

+0

該查詢的結果是什麼,它應該是什麼?問題PHP是否具體? – chris85

+0

它顯示的總數爲8,但blog_likes表中只有2條記錄,其中blog_id = 2 –

+0

您不應該在blog_likes的列ID中使用相同的值 – Gusepo

回答

1

你的問題是,你是沿着兩個維度在同一時間聚集。產生一個笛卡爾積 - 每行與每個註釋成對,總共爲l * c行。

解決這個問題的最簡單的方法是使用DISTINCT關鍵字:

SELECT b.id, count(DISTINCT bl.id) as likes , count(DISTINCT bc.id) as comments 
FROM blog b LEFT JOIN 
    blog_comments bc 
    ON b.id = bc.blog_id LEFT JOIN 
    blog_likes 
    ON b.id = bl.blog_id 
GROUP BY b.id; 

如果你有一個有很多喜歡的和大量的評論文章,這是不推薦,因爲它創造的笛卡爾乘積他們倆。

這有幾種解決方案,但我會建議相關子查詢:

select b.id, 
     (select count(*) from blog_likes bl where bl.blog_id = b.id) as likes, 
     (select count(*) from blog_comments bc where bc.blog_id = b.id) as comments 
from blogs b; 

這可能需要在blog_likes(blog_id)blog_comments(blog_id)優勢指標。

+0

已解決,謝謝對於您的幫助和編輯帖子 –

0

這是根據我的表它會幫助你...

SELECT people.pe_name,COUNT(不同orders.ord_id)AS NUM_ORDERS,COUNT(items.item_id)AS項數從人INNER JOIN命令ON orders.pe_id = people.pe_id INNER JOIN items ON items.ord_id = orders.ord_id GROUP BY people.pe_id;

相關問題