2010-11-02 12 views
0

J'ai une table des commentaires et une table de messagesMySQL soustracteurs plusieurs fois pour une même ligne de mise à jour

Chaque fois qu'un poste est supprimé, une requête est exécutée pour soustraire le nombre de commentaires (qui sont supprimés par la suite) de chaque le COMMENT_COUNT de l'utilisateur

donc, si un utilisateur a 2 commentaires dans un poste, et ce poste est supprimé, leur équilibre devrait avoir 2 soustraites il

Ma requête est la suivante:

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

utilisateur A a 2 commentaires avec .post = 1, mais pour une raison que l'utilisateur ne se soustrait COMMENT_COUNT par 1 fois, quand il devrait se produire deux fois

Je pense que ma syntaxe est juste parce que quand je:

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

je reçois deux résultats pour l'utilisateur A

ne devrait pas être UPDATE itérer sur ces deux résultats, soustrayant à chaque fois?

Quelqu'un peut-il expliquer ce qui me manque? merci

Répondre

1

Si vous allez stocker le compte, utilisez:

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

... ou:

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 

Il n'y a aucun point en se fondant sur deux enregistrements pour soustraire deux fois, quand vous pourriez effectuer l'opération une fois.

Je préfère ne pas stocker de telles valeurs, car elles peuvent être calculées sur la base des enregistrements sans avoir à gérer la synchronisation des comptes. Une view pourrait être une meilleure idée ...

+0

+1 Bonne réponse, ne connaissait pas la syntaxe exacte MySQL, donc j'ai attendu que vous répondiez X-) –

+0

aussi ils peuvent être maintenus par des déclencheurs. Btw, 'COUNT (*)' en temps réel est presque toujours cher (c'est-à-dire lorsque vous avez besoin de "trier par commentaires" - pour obtenir les publications les plus populaires). – zerkms

+0

@zerkms: J'essaie de ne pas utiliser de déclencheurs si je n'ai pas à, ce qui est presque impossible sur MySQL :) –