2011-11-03 80 views
0

我們目前正試圖做一個簡單的(?)SQL查詢。計算每個帖子的投票數

我們有這兩個表:

create table `post` (
    `id` integer primary key 
) 
create table `vote` (
    `id` integer primary key, 
    `post_id` references `post`.`id`, // Well ok, it's a foreign key then... 
    `value` int // 1 for a positive vote, or zero for a negative one 
) 

我們正在試圖建立一個選擇會,對每個崗位,返回的正,負票數:SELECT post.id, <positive count>, <negative count> ...

雖然這不是很難做到子選擇,挑戰從我們試圖做到沒有子選擇時開始,但是與join。我們使用的是left outer join,如果帖子只有正面或負面的投票,就會出現問題。

雖然我理解這個問題,但我不知道如何做到這一點只與join,但我相信它可以做到沒有子選擇。你會怎麼做?

(好吧,我不包括我目前的查詢,因此它不會引導你走錯了方向......)

+0

您正在使用哪臺服務器? – sll

+0

運行MySQL 5 – aspyct

回答

0

以前的答案是垃圾,我忘了GROUP。下面是一個使用CASE替代方案,我認爲它處理NULL的情況下(因爲WHEN條款將NULL),但你可能需要畢竟使用COALESCE ...:

SELECT post.id, SUM(CASE WHEN a.vote > 0 THEN 1 ELSE 0 END) up, SUM(CASE WHEN a.vote < 0 THEN 1 ELSE 0 END) down FROM post LEFT JOIN vote a ON (a.post_id = post.id) GROUP BY post.id 

上一頁(不正確)答案:

這聽起來像你需要使用COALESCE強制NULL零 - 以下可能會奏效,但未經測試:

SELECT post.id, SUM(COALESCE(a.vote,0)), SUM(COALESCE(b.vote,0)) FROM post LEFT JOIN vote a ON (a.post_id = post.id AND value > 0) LEFT JOIN vote b ON (b.post_id = post.id AND value < 0) 
+0

哦,我不知道我們可以製作「複雜」連接標準......我總是使用簡單的「xx.yy_id = yy.id」。那麼這是缺失的部分,我錯過了很久!非常感謝(從我們兩個;)) – aspyct