mySQL:从评论表和更新用户表计算用户信誉

时间:2016-12-22 07:07:23

标签: mysql

我有两个MySQL表:comments

CommentID   UserID  Score
1           10      -5
2           10      2
3           11      3
4           11      0
5           12      2

...和users

UserID  CommentsReputation
10      0
11      0

我无法想出一个有效的MySQL查询,它会将第二个表中的每个用户CommentsReputation设置为属于该用户的评论的所有分数的总和。挑战在于我用来构建查询的唯一输入是CommentID(意思是我不知道将在其中执行查询的代码位置的UserID。) / p>

例如,给定CommentID=3,我想将UserID 11的所有分数相加,并将该用户CommentsReputation设置为3+0+2

这是我到目前为止所做的:

UPDATE `user` u SET u.`CommentsReputation` = (
    SELECT SUM(c.`Score`) FROM `comments` c
    WHERE c.`UserID`= (
      SELECT c2.`UserID` FROM `comments` c2
      WHERE c2.`CommentID`= 3
    )
)

这将正确选择属于用户#11的分数总和,但它不会更新users表中的正确行

我知道我可以将其拆分为一个查询,以便在UserID选择CommentID=3,并在知道UserID的情况下选择第二个查询。希望有一种更有效的方法。

1 个答案:

答案 0 :(得分:1)

这应该这样做:

UPDATE users u
  JOIN (
      SELECT UserID, SUM(Score) AS TotalScore
        FROM comments
       WHERE UserID = (SELECT UserID FROM comments WHERE CommentID = 3)
     ) c ON c.UserID = u.UserID
   SET u.CommentsReputation = c.TotalScore;

SQL Fiddle

如果您想一次更新所有用户,可以使用带有GROUP BY的类似子查询:

UPDATE users u
  JOIN (
      SELECT UserID, SUM(Score) AS TotalScore
        FROM comments
       GROUP BY UserID
     ) c ON c.UserID = u.UserID
   SET u.CommentsReputation = c.TotalScore;

SQL Fiddle