2010-11-02 2 views
0

У меня есть таблица замечаний и таблица сообщенийMySQL вычитая несколько раз для одной строки в обновлении

Всякий раза, когда сообщение будет удалено, запрос выполняется вычесть количество комментариев (которые будут удалены позже) от каждого COMMENT_COUNT пользователя

Таким образом, если пользователь имеет 2 комментариев в посте, и пост будет удален, их баланс должен иметь 2 вычитают из него

Мой запрос выглядит следующим образом:

UPDATE users 
INNER JOIN comment ON users.id = comment.author 
     SET comment_count = comment_count - 1 
    WHERE comment.post = 1 

Пользователь А имеет 2 комментария с .post = 1, но по какой-то причине, что пользователь получает только COMMENT_COUNT вычтена на 1 раз, когда это должно произойти дважды

Я думаю, что мой синтаксис является правильным, потому что, когда я:

SELECT * 
     FROM users 
INNER JOIN comment ON users.id = comment.author 
    WHERE comment.post = 1 

я получаю два результата для пользователя А

Если не UPDATE быть итерация над этими двумя результатами, вычитая каждый раз?

Может кто-нибудь объяснить, чего я не хватает? спасибо

ответ

1

Если вы собираетесь хранить счета, использование:

UPDATE USERS 
    SET comment_count = (SELECT COUNT(*) 
          FROM COMMENT c 
         WHERE c.author = USERS.id) 

... или:

UPDATE USERS u 
    JOIN (SELECT c.author, 
       COUNT(*) AS numComments 
      FROM COMMENT c 
     GROUP BY c.author) x ON x.author = u.id 
    SET comment_count = x.numComments 

Там нет смысла полагаться на две записи вычесть два раза, когда вы можете выполнить операцию один раз.

Я предпочитаю не хранить такие значения, потому что они могут быть рассчитаны на основе записей без хлопот, связанных с синхронизацией счетчиков. A view может быть лучшей идеей ...

+0

+1 Хороший ответ, не знал точного синтаксиса MySQL, поэтому я ждал, когда вы ответите на X-) –

+0

, также они могут поддерживаться триггерами. Btw, 'COUNT (*)' в реальном времени почти всегда дорогой (т. Е. Когда вам нужно «сортировать по комментариям» - получать самые популярные публикации). – zerkms

+0

@zerkms: Я стараюсь не использовать триггеры, если мне это не нужно, что почти невозможно на MySQL :) –

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