Sequelize查询报错:未知列'Assessments.rating',求排查方法
问题排查与修复方案
嗨,我来帮你梳理下导致这个错误的原因,主要有两处问题需要修正:
1. 关联表引用错误:用了原表名而非定义的别名
你的Post模型里,和Assessment的关联明确设置了别名PostAssessments:
models.Post.hasMany(models.Assessment, {as: 'PostAssessments'});
但在查询的AVG函数里,你直接用了原表名Assessments.rating,Sequelize会根据你定义的别名来生成SQL中的表别名,所以这里必须改成别名对应的字段路径:PostAssessments.rating。
2. 聚合字段不能放在where中过滤
你在where选项里尝试过滤average: 1,但average是通过AVG()计算出来的聚合结果。SQL规则里,where用于过滤原始数据行,having才用于过滤聚合后的结果,所以得把这个条件移到having选项里。
修正后的完整查询代码
db.Post.findAll({ include: [ { model: db.User, as: 'Boosters', where: {id: {[Op.in]: a_set_of_ids }} }, { model: db.Assessment, as: 'PostAssessments', where: {UserId: {[Op.in]: another_set_of_ids}} } ], attributes: [ 'id', // 必须显式包含group by的字段,避免数据库严格模式报错 [db.sequelize.fn('AVG', db.sequelize.col('PostAssessments.rating')), 'average'] ], group: ['id'], having: { average: 1 }, // 把原where的聚合条件移到这里 limit: 20 })
另外补充一点:因为group选项指定了['id'],所以attributes里最好显式包含id字段,避免部分数据库(比如MySQL)在严格模式下抛出语法错误。
内容的提问来源于stack exchange,提问作者Farnaz Jahanbakhsh
相关产品推荐
相关产品推荐

