2016-07-25 44 views
0

我有一個查詢問題,給定一個帶有帖子的表和一個帶有postsvotes的帖子,其中postvotes包含帖子的ID和投票類型(' UP「或」DOWN「),輸出每個帖子的」UP「票數和」DOWN「票數。當0和麻煩加入時,結果中不包括COUNT(*)

我嘗試使用享有以下查詢:

DROP VIEW P, U, D; 
CREATE VIEW P AS SELECT p.id, p.title, p.content FROM posts as p, users as u WHERE u.id = p.userId GROUP BY p.id ORDER BY p.datetime DESC; 
CREATE VIEW U AS SELECT count(*) as Uvotes, postId FROM postsvotes, posts WHERE posts.id = postsvotes.postId AND postsvotes.type = 'UP' GROUP BY postId; 
CREATE VIEW D AS SELECT count(*) as Dvotes, postId FROM postsvotes, posts WHERE posts.id = postsvotes.postId AND postsvotes.type = 'DOWN' GROUP BY postId; 
SELECT Uvotes, Dvotes, u.postId as postId FROM U, D WHERE u.postId = d.postId GROUP BY postId; 

它有點兒工作,但只有當至少有1「UP」投票和1「DOWN」投票的帖子,否則不考慮它。我發現問題出現在U和D視圖中,0表決的記錄沒有放在視圖中。

關於如何解決任何想法?

+0

你很可能並不需要這些觀點,一個查詢可以做的工作 - 可能使用'外join'。如果你可以提供樣本數據和預期結果,它會使它更容易理解。 – sgeddes

+0

你想要什麼結果?請在這裏添加更多細節。 –

+0

謝謝!我對SQL不太擅長,但我想單一查詢解決方案是完美的。 ![Posts posts](http://imgur.com/Fu0MU3z.png)![Postsvotes table](http://imgur.com/CWlJeCA.png)[這是我得到的結果](http:// imgur .com/qE51ekf.png),但它也應該包含0個upvotes和/或0個downvotes的行,而現在它只有至少有1個upvote和1個downvote的行。 –

回答

0

假設postvotes表只有包含有至少一個upvote或downvote的帖子,您可以嘗試下面的查詢。

--Get upvote and downvote count for posts in the postvotes table 
SELECT 
postId 
,count(case when type = 'UP' then 1 end) upvotes 
,count(case when type = 'DOWN' then 1 end) downvotes 
FROM postvotes 
GROUP BY postId 
UNION ALL 
--Get posts that have no votes at all 
SELECT Id, 0, 0 
FROM posts p 
WHERE NOT EXISTS (select 1 from postvotes where postId = p.Id) 
+0

嗚呼!這解決了我與SQL的問題。我不得不考慮你使用過的我不完全瞭解的更復雜的結構,我仍然有很多東西需要學習。謝謝! –

0

我覺得你只是想要一個left join和聚集:

SELECT p.postId, 
     SUM(pv.type = 'UP') as Upvotes, 
     SUM(pv.type = 'DOWN') as Downvotes, 
FROM posts p LEFT JOIN 
    postvotes pv 
    ON p.postId = pv.postId 
GROUP BY p.postId;