You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:02:58