2012-07-18 146 views
0

我發現了一堆類似的問題,但沒有爲我工作,或者我太愚蠢以至於無法正確地做到這一點。 訪問計數工作正常,如果我使用COUNT(DISTINCT visits.id)但是然後投票計數完全錯誤 - 它顯示的值比應該大3到4倍。SQL SUM和COUNT返回錯誤的值

所以這是查詢

SELECT SUM(votes.rating), COUNT(visits.id) 
FROM topics 
LEFT JOIN visits ON (visits.content_id = topics.id) 
LEFT JOIN votes ON (votes.content_id = topics.id) 
WHERE topics.id='1' 
GROUP BY topics.id 

表看起來像這樣

id int(11) | rating tinyint(4) | content_id int(11) | uid int(11) 

訪問

id int(11) | content_id int(11) | uid int(11) 

主題

id int(11) | name varchar(128) | message varchar(512) | uid int(11) 

有幫助嗎?

+0

無關,但您應該使用'WHERE topics.id = 1'而不是'='1'',因爲'id'是一個int列。 – 2012-07-18 16:20:09

回答

2

基本上,你總結或計算可能返回的行數。因此,如果每個ID有三次訪問和四次投票,那麼訪問將乘以四,並且投票三次。

我想你想可以簡單使用子查詢ackomplished什麼:

SELECT (SELECT SUM(v.rating) FROM votes v WHERE v.content_id = t.id), 
     (SELECT COUNT(vi.id) FROM visits vi WHERE vi.content_id = t.id) 
FROM topics t 
WHERE t.id=1 
GROUP BY t.id 
+0

工作正常,但有沒有聯接的解決方案? – RasterCore 2012-07-18 16:29:22

+0

忘了吧,我會用這個 謝謝:) – RasterCore 2012-07-18 16:37:01

0

我懷疑問題出在與表投票連接。
如果票數超過一行,您將使用同樣重複的行數。
如果您使用distinct,則會跳過Ids的重複(由於加入了投票)。
作爲第一個病毒,我會暫時讓投票加入,看看會發生什麼。
希望它有幫助

0

沒有看到這是一個有點艱難的調試數據,但我想這是因爲有有餘票參觀。以下應爲你工作:

SELECT (SELECT SUM (rating) FROM votes WHERE votes.content_id = topics.id), (SELECT COUNT (1) FROM visits WHERE visits.content_id = topics.id) FROM topics WHERE topics.id = 1

0

你需要做的這是兩個獨立的子查詢:

SELECT sumrating, numvisit 
FROM (select visits.content_id, count(*) as numvisits 
     from visits 
    ) tvisit left outer join 
    (select votes.content_id, SUM(votes.rating) as sumrating 
     from votes 
     group by votes.content_id 
    ) v 
    ON (v.content_id = tvisit.content_id) 
WHERE tvisit.content_id='1' 

事實證明,你不需要在主題表加盟所有。