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

如何将包含COUNT、SUM、INNER JOIN的原生SQL转为Sequelize查询

问题排查

  • attributes配置错误:填写的'count'是查询items表的count字段,不是你需要的COUNT(*)聚合结果;计算sum时没有指定reviews表的rating字段,会默认查询items表字段导致报错
  • 关联配置冗余:include内不需要写空where数组,required: true已经对应原生SQL的INNER JOIN逻辑
  • where条件写法不规范:直接拼接变量存在SQL注入风险,应该使用Sequelize提供的literal方法包裹原生SQL片段
  • 查询方法选择错误:findAndCountAll用于分页场景会自动执行两次查询,你只需要全局聚合结果,使用findOne即可

正确实现

首先确保你已经提前正确定义了两个模型的关联:

// 关联定义示例,放在模型初始化后执行
ItemModel.belongsTo(models.ReviewModel, { foreignKey: 'review_id' })

查询代码如下:

const result = await ItemModel.findOne({
  attributes: [
    [sequelize.fn('COUNT', sequelize.literal('*')), 'count'],
    [sequelize.fn('SUM', sequelize.col('ReviewModel.rating')), 'sum']
  ],
  include: [{
    model: models.ReviewModel,
    required: true
  }],
  // 推荐使用参数绑定写法避免SQL注入
  where: sequelize.literal(`items.connector->'SOLD'->>'name' = ?`),
  replacements: [itemName],
  raw: true // 直接返回JSON结果,不包裹Sequelize实例
})

如果你的关联设置了自定义别名as,需要将sequelize.col('ReviewModel.rating')中的ReviewModel替换为你设置的别名即可。

内容的提问来源于stack exchange,提问作者Ludovic Argenty

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 09:57:04