2014-04-04 83 views
1

我有一個表Content顯示COUNT(*)列值0在多行

內容(ID,contentText,contentDate,ID用戶所→用戶,則contentType)

和表VoteQuestion

VoteQuestion(ID用戶→用戶,idQuestion→內容,ISUP)

我要選擇,例如,第前30個最近的問題。

SELECT * 
FROM "Content" 
WHERE "type" = 'QUESTION' 
ORDER BY "contentDate" 
LIMIT 30 

不過,我想連接到與此有關這一問題的資料另一列,所以我不需要再次查詢數據庫返回的每一個問題。

例如,我想要計算每個問題的投票數,並將其全部返回到同一行。

實施例:

| id | contentText | contentDate | idUser | contentType | votes | 
----------------------------------------------------------------- 
| 2 | 'abc'  | '2013-03-25'| 192 | 'QUESTION' | 10 | 

我嘗試以下查詢:

WITH question AS 
(SELECT * 
FROM "Content" 
WHERE "type" = 'QUESTION' 
ORDER BY "contentDate" 
LIMIT 30 
) 

SELECT COUNT("VoteQuestion"."idUser") 
FROM "VoteQuestion", question 
WHERE "idQuestion" = question."id" 
GROUP BY question."id"; 

但這並不與票數返回問題= 0(僅16個問題返回而不是30)。如何解決它?

那麼,我該如何集中這兩個表?我怎樣才能減去isUp爲真,isUp在查詢中爲false?

回答

1

您可以再選擇的投票數:

SELECT Content.* , 
(
    SELECT COUNT(*) 
    FROM VoteQuestion 
    WHERE idQuestion = Content.id 
) as votes 
FROM Content 
WHERE type = 'QUESTION' 
ORDER BY contentDate 
LIMIT 30 
+0

我很欣賞你的答案,但我怎麼能完成我的最後一個問題? '如果我在查詢中isUp爲真且isUp爲假,我怎麼能減去選票?'有沒有簡單的方法來做到這一點,或者我應該創建2個不同的列upvotes和downvotes列? –

+1

而不是使用計數,你可以使用像SUM(CASE WHEN isUp = TRUE THEN 1 ELSE -1 END)。因此,對於每個具有isUp = TRUE的記錄,您都要添加一個,對於每個記錄with isUp = FALSE,您減去一個。 –

1

你需要一個外部聯接爲:

WITH question AS (
    SELECT * 
    FROM "Content" 
    WHERE "type" = 'QUESTION' 
    ORDER BY "contentDate" 
    LIMIT 30 
) 
SELECT COUNT("VoteQuestion"."idUser") 
FROM question 
    LEFT JOIN "VoteQuestion" ON "idQuestion" = question."id" 
GROUP BY question."id";