PostgreSQL如何根据另一个表上的插入在一个表上的列上创建AVG

时间:2018-10-03 14:57:06

标签: postgresql sequelize.js

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

我想要的是一个每当插入新评论时都会触发的功能

因此在带有提供者ID的评论表上插入评论 =>函数,用于对具有相同provider_id的提供者进行平均评分  => 更新提供者表上的averageRating

类似的东西

<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.2/Chart.min.js"></script>
<canvas id="chart"></canvas>
<button id="switch">Switch</button>

1 个答案:

答案 0 :(得分:0)

要直接回答您的问题,请参考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();

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