2012-05-21 61 views
1

我一直在創建我自己的留言板,雖然它工作正常,但我想添加投票投票(圖中末尾的帖子)。如何將MySQL SUM()函數添加到此查詢中?

我把我從我的兩個表想要的數據msgboard_user和msgboard_post這樣的:所以現在我需要用第三個表,msgboard_vote合作

SELECT p.post_id, p.user_id, u.username, get_time_diff(p.date) as date, p.ip, p.text, p.parent_post_id, p.approved AS posts 
FROM msgboard_post p, msgboard_user u 
WHERE p.user_id = u.user_id 
AND p.approved = "yes" 
ORDER BY p.date DESC 
-- code for limit... 

。每張投票都會在表格中顯示一行,我希望我的結果中有一列可以對該帖子的投票進行總結。投票(vote_value)可以是1或-1。沒有投票的帖子(msgboard_vote中沒有行)最好在結果中總結爲0,null也可以。

擺弄了幾個小時...:/ 將不勝感激一些幫助在此:)

enter image description here

回答

1

避免在選定列和WHERE子句中進行子選擇,優化程序不能很好地處理它們。

SELECT p.post_id, p.user_id, u.username, 
    get_time_diff(p.date) as date, p.ip, p.text, 
    p.parent_post_id, p.approved AS posts, 
IFNULL(v.vote_count, 0) AS vote_count 
FROM msgboard_user u, msgboard_post p 
LEFT JOIN 
(SELECT post_id, COUNT(*) vote_count FROM msgboard_vote GROUP BY post_id) v 
ON p.post_id = v.post_id 
WHERE p.user_id = u.user_id 
AND p.approved = "yes" 
ORDER BY p.date DESC 
+0

謝謝Malvolio幫助我。真的超級!我甚至可能會轉換爲計數(*),因爲在您的代碼而不是總和。我不確定如果用戶開始投票,他們會被冒犯。也許是最好的。 – Marcus

+1

如果你可以使用'count',你應該這樣做,因爲有時候優化器可以只從索引頁面計算出計數值,並且查詢的運行速度要快兩倍。如果使用SUM,它可能需要檢索實際值來檢查它是否爲非空值。 – Malvolio

1

嗯,我想最簡單的方法是將一些嵌套查詢添加到SELECT子句,像這樣:

SELECT p.post_id, (SELECT SUM(vote_value) FROM msgboard_vote WHERE post_id = p.post_id) AS vote_count... 

您是否嘗試過 - 或類似的東西?

+0

我也一直在看手冊。有些部分我似乎並不瞭解,而且我的工作方法以結果顯示我的所有專欄結束,但僅限於那些有投票記錄的結果。會用你的代碼修補一下!謝謝:) – Marcus

+0

完美的作品!再次感謝!現在,如果MySQL只有nvl()... :) – Marcus