【问题标题】:PostgreSQL How to make an AVG on a column on one table based on an insert on another tablePostgreSQL 如何根据另一张表上的插入在一个表上的列上制作 AVG
【发布时间】:2018-10-03 14:57:05
【问题描述】:

所以这是我的问题,我有这个表提供程序,其列 averageRating 取决于保存在表评论中的用户评级

我想要一个在插入新评论时触发的功能

所以在带有 provider_id 的评论表上插入评论 => 对具有相同 provider_id 的提供者的评分进行平均的函数 => 更新 provider 表上的 averageRating

类似的东西

CREATE TRIGGER updateAvg
AFTER INSERT OR UPDATE ON reviews
FOR EACH ROW
UPDATE providers.averageRating SET review.rating = (SELECT AVG(rating) FROM reviews)

【问题讨论】:

标签: postgresql sequelize.js


【解决方案1】:

要直接回答您的问题,请参阅 postgres 文档https://www.postgresql.org/docs/9.2/static/plpgsql-trigger.html,您必须创建一个函数来执行触发器。

CREATE FUNCTION update_average_rating()
RETURNS void
LANGUAGE plpgsql as $$
BEGIN
  UPDATE providers SET averageRating = AVG(rating)
  FROM reviews 
  WHERE providers.id = reviews.provider_id 
  AND NEW.provider_id = reviews.provider_id;
END;
$$;

CREATE TRIGGER updateAvg
AFTER INSERT OR UPDATE ON reviews
FOR EACH ROW 
EXECUTE PROCEDURE update_average_rating();

但是,似乎更好的解决方案是使用架构设计来解决此问题。无论您需要在哪里显示平均评分,都应该是取平均值的视图的一部分,这样您就可以最大限度地降低数据库性能的实际成本并根据需要检索值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多