在我的数据库中,我有以下相关表格:
users
、listings
和reviews
users
有很多listings
listings
有很多reviews
reviews
有一个列 value
,它是 0 到 5 之间的浮点数。
我希望能够对用户进行评分,其定义为:
用户拥有的
value
的所有 reviews
的平均 listings
。
在 Sequelize 中,我有这个:
User.findById(userId, {
include: [
{
model: Listing,
order: [
[Review, 'updatedAt', 'desc']
],
include: [
{
model: Review,
include: [User]
}
],
}
]
})
这成功地让我:
user
字段listings
reviews
对于那些listings
此时我确实有足够的信息来计算
user
平均评分,但这是假设我从未对该查询中的 listings
或 reviews
的数量设置任何限制。为了使应用程序能够扩展,我需要限制,因此我必须能够使用聚合函数来计算 listing
和 user
的平均评级。
我对 Sequelize 和 SQL 总体来说还很陌生。我怎样才能做到这一点?
已经快六年了,但这里是答案,以防有人需要。
假设(用户 <-> 列表)和(列表 <-> 评论)是多对多关联
const user = await User.findById(userId, {
group: ['User.id'],
attributes: {
include: [
[Sequelize.literal('AVG("listings->reviews"."value")'), 'avgReview'],
],
},
include: [
{
model: Listing,
as: 'listings',
attributes: [],
through: { attributes: [] },
include: [
{
model: Review,
as: 'reviews',
attributes: [],
through: { attributes: [] },
}
],
}
]
});
这会从连接表和关联表的模型中删除属性,因此我们不必按它们进行分组。
attributes: [],
through: { attributes: [] },