我有两个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
的情况下选择第二个查询。希望有一种更有效的方法。
答案 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;
如果您想一次更新所有用户,可以使用带有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;