如何将包含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
相关产品推荐
相关产品推荐

