【问题标题】:Update a column using the value of another column per row使用每行另一列的值更新一列
【发布时间】:2021-02-08 00:25:23
【问题描述】:

我正在尝试根据一对多关系中另一个表的值更新一个表中的值,其中会有一部电影但有很多评论

这是我的表的架构

movie
+----+-------------+------+
| id | reviewCount |score |
+----+-------------+------+
review
+--------+---------+-------+
| userId | movieId | score |
+--------+---------+-------+

这是我要运行的查询

UPDATE movie 
SET score = 
CASE 
    WHEN m."reviewCount" = 1 
    THEN 0 
    ELSE ((m.score * m."reviewCount") - r.score) / (m."reviewCount" - 1) 
END,
"reviewCount" = m."reviewCount" - 1 
FROM movie AS m INNER JOIN (
    SELECT "userId", "movieId", score
    FROM review) r 
ON m.id = r."movieId" 
WHERE r."userId" = $1;

但是,当我运行它时,我在所有行中都得到了相同的值,而不是考虑每条评论的分数。有什么我做错了还是有更好的方法来运行这个查询?

【问题讨论】:

    标签: postgresql join sql-update


    【解决方案1】:

    As documented in the manual您不应该在 FROM 子句中重复 UPDATE 的目标表。

    也不需要派生表(“子查询”)从review 表中获取值:

    UPDATE movie m
      SET score = CASE 
                    WHEN m."reviewCount" = 1 THEN 0 
                    ELSE ((m.score * m."reviewCount") - r.score) / (m."reviewCount" - 1) 
                  END,
          "reviewCount" = m."reviewCount" - 1 
    FROM review r
    WHERE m.id = r."movieId" --<< this is the join between the two tables
      AND r."userId" = $1;
    

    这假设每个用户只评论每部电影一次(即评论表中的每个用户 ID/电影组合一行)。如果不是这样,结果是不可预测的。

    【讨论】:

      【解决方案2】:

      最后一行应该有

      ON m.id = r."movieId" 
      WHERE movie.id = r."movieId" AND r."userId" = $1; 
      

      而不是 m.id = r."movieId"

      【讨论】:

        猜你喜欢
        • 2014-11-25
        • 1970-01-01
        • 1970-01-01
        • 2010-11-22
        • 2021-06-20
        • 1970-01-01
        • 1970-01-01
        • 2018-11-01
        • 1970-01-01
        相关资源
        最近更新 更多