2013-12-11 3 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

Что такое 'p' в' UPDATE posts 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

Что такое 'p' в' UPDATE posts p'? – Bagwell

+1

Это псевдоним таблицы. – Hardy

+1

@Bagwell это «псевдоним», потому что у вас будет одно имя таблицы в UPDATE и SELECT, поэтому мы используем его для дифференциации. Вы можете использовать любое имя. Я использовал «p», потому что это первая буква, это похоже на соглашение, использующее первую букву из таблицы в псевдоним. –

Смежные вопросы