2013-12-11 50 views
0

在我的數據庫,我有上崗以下結構:增量總答覆後

post_id | reply_to | parent_id 
    1   1   1 
    2   1   1 
    3   2   1 
    4   3   1 

因此,在這種情況下,POST_ID 1是主哨,而POST_ID 2是POST_ID 1的答覆, post_id 3是對post_id 2的回覆,post_id是對post_id 3的回覆。

我想要做的是添加另一列,以跟蹤對帖子的回覆總數。所以最終,表格看起來是這樣的:

post_id | reply_to | parent_id | total_replies 
    1   1   1   3 
    2   1   1   2 
    3   2   1   1 
    4   3   1   0 

如果我想更新回覆的總數,查詢的外觀如何?

謝謝。 :)

回答

0

喜歡的東西:

update posts p set total_replies = (select count(t.post_id) from 
posts t where t.reply_to = p.post_id) 
+0

'UPDATE posts p'中的'p'是什麼?那麼't'呢? – Bagwell

1

如果你想只是做每交一個簡單的計算,你這樣做:

UPDATE posts 
     LEFT JOIN 
     (
      SELECT post_id , (SELECT count(*) from posts p0 where p.post_id = p0.reply_to) as total_replies 
      FROM posts p 
     ) p2 ON posts.post_id = p2.post_id 
SET  posts.total_replies =p2.total_replies; 

看到它在那裏工作:http://sqlfiddle.com/#!2/868c6/1

現在,你想要做的是遞歸閱讀,計算回覆,直到它到達頂端的帖子。更糟糕的方法是在查詢數據時計算這個值,所以只要在保存新帖子時進行計算,就可以在PHP中執行此操作,或者在數據庫中創建存儲過程/函數,它將如下所示:

$total_reply = 0; 

function calculateTotalReply($postId) 
{ 

    //Make the simple sum as I did above 
    $total_reply = $sum; 

    //Check if is the top post 
    if(!$isTheTopPost) 
    { 
     calculateTotalReply($parentPost); 
    } 

} 

所以,正如你所看到的,它會自稱自己,直到到達頂端的帖子,最後在$total_reply你會得到你想要的總和。

+0

'UPDATE posts p'中的'p'是什麼? – Bagwell

+1

它是表別名。 – Hardy

+1

@Bagwell它是一個'別名',因爲你將在UPDATE和SELECT中擁有相同的表名,所以我們用它來區分。您可以使用任何名稱..我使用'p'是因爲它是第一個字母,它就像使用從表到別名的第一個字母的約定。 –