如何使用表B中的记录计数更新表A中的分数列?

问题描述:

我有一个posts表和一个likes表。许多用户可以喜欢帖子。 posts表具有非规范化的likesScore列,表示邮政拥有的likes的数量。我想通过在likes@postId上执行COUNT(*)来更新posts.likesScore表。如何使用表B中的记录计数更新表A中的分数列?

我对如何做到这一点的想法,但我不能得到正确的语法:

UPDATE posts 
SET likesScore = ... 
WHERE posts.id = @postId 

MySQL UPDATE statements support JOINs - 使用:

UPDATE POSTS p 
     JOIN (SELECT t.postid, 
        COUNT(*) AS cnt 
       FROM LIKES t 
      GROUP BY t.postid) l ON l.postid = p.postid 
    SET likesscore = l.cnt 

的标准方法是使用子查询,但是这需要WHERE子句中的子查询过滤中的关联 - 否则存在更新没有引用的记录的风险支持表格。

我更喜欢不使用视图将计数存储在表中,因为每次在这种情况下LIKE都有数据与数据不同步的风险很大。

+0

@OMG小马,非常感谢。我可以问你在子查询中使用“group by”吗?我不能只使用“where postId = @postId”?此外,你说使用连接,但我看不到在该查询中的连接,或至少关键词“加入”...我错过了什么? – Mohamad 2011-01-27 16:51:03

UPDATE posts 
SET likesScore = (SELECT count(*) FROM likes WHERE likes.id=posts.id) 
WHERE ...