使用Sequelize

时间:2016-03-04 22:48:18

标签: average sequelize.js

我试图找到一个'评分的平均值。所有具有相同' VenueId'的数据的列。我有它使用原始代码但需要在Sequelize中进行调整。工作原始代码是

SELECT venueId, AVG(rating) AS average FROM reviews GROUP BY VenueId

我尝试的代码是

Review.findAll({
    order: [[Sequelize.fn('AVG', Sequelize.col('rating'))]]
}).then(function(Venues) {})

我收到错误:

  

执行(默认):SELECT id,review,rating,createdAt,updatedAt,   VenueId来自评论AS评论ORDER BY max(评级);未处理   rejection SequelizeDatabaseError:UNKNOWN_CODE_PLEASE_REPORT:   ORDER BY的表达式#1包含聚合函数并适用于   非聚合查询的结果。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

这可能需要一些调整,因为我不知道你的模型,但我建议你尝试以下方法:

Review.findAll({
   attributes: ['venueId', [models.sequelize.fn('AVG', models.sequelize.col('venue_id')), 'venueIdCount']],
   group: 'venue_id'
   order: [[models.sequelize.fn('AVG', models.sequelize.col('venue_id')), 'DESC']]
}).then(function() {
   //Do something
}})

需要注意的重要事项:当我使用“venueId”时,我指的是模型上属性的名称,当我使用“venue_id”时,我指的是数据库表中列的名称。它们可能相同或不同,所以请随意调整它。

答案 1 :(得分:1)

你必须这样做

Review.findAll({
    attributes: ['venueId', [models.sequelize.fn('AVG', 
    models.sequelize.col('rating')), 'ratingAvg']],
    group: ['venueId'],
    order: [[models.sequelize.fn('AVG', models.sequelize.col('rating')), 'DESC']]
}).then(function() {
    //Do something
}})

或者使用async / await

async(() => {
    return await(Review.findAll({
        attributes: ['venueId', [models.sequelize.fn('AVG', 
        models.sequelize.col('rating')), 'ratingAvg']],
        group: ['venueId'],
        order: [[models.sequelize.fn('AVG', models.sequelize.col('rating')), 'DESC']]}))
})