Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mySQL:从评论表和更新用户表计算用户信誉_Mysql - Fatal编程技术网

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

mySQL:从评论表和更新用户表计算用户信誉,mysql,Mysql,我有两个MySQL表:comments 。。。和用户 我很难想出一个高效的MySQL查询,它会将第二个表中每个用户的评论计算设置为属于该用户的评论的所有分数之和。挑战在于,我唯一可以用来构建查询的输入是CommentID,这意味着我不知道执行查询的代码位置的用户ID 例如,给定CommentID=3,我想将UserID 11的所有分数相加,并将该用户的CommentsReputation设置为3+0+2 以下是我到目前为止的情况: UPDATE `user` u SET u.`CommentsR

我有两个MySQL表:comments

。。。和用户

我很难想出一个高效的MySQL查询,它会将第二个表中每个用户的评论计算设置为属于该用户的评论的所有分数之和。挑战在于,我唯一可以用来构建查询的输入是CommentID,这意味着我不知道执行查询的代码位置的用户ID

例如,给定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的分数总和,但不会更新用户表中的正确行

我知道我可以将其拆分为一个查询,以选择CommentID=3处的用户ID,以及第二个具有用户ID知识的查询。希望有一个更有效的方法。

这应该可以做到:

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;
如果要同时更新所有用户,可以使用类似的子查询和分组方式:


这有一股难闻的气味。您不应该存储可以从其他列派生的数据。@shmosel正在寻找效率。我打算把它作为一个触发器;每当分数更新时,commentsreputation也会更新,以减少依赖信誉的后续查询的计算时间。声誉也会每隔几分钟被查询一次,所以我想不是每次都为所有用户再次计算声誉,而是存储计算结果,并在更新因变量时更改结果。也许我应该重新考虑一下。你们的桌子很大吗?一次更新所有用户可能更简单。按照MySQL标准,可能不会被认为太大。每张桌子上万行谢谢@shmosel。我不知道我们可以对连接的结果执行插入、更新或删除操作,因为这些表只存在于内存中。PS:如果您有时间,请显示另一个查询,该查询将更新users表中的所有记录,而不仅仅是用户与目标CommentID匹配的记录。
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
    )
)
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;
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;