Sequelize使用Group by与Having未达预期,对应ORM查询是否存在问题?
你的Sequelize查询存在以下问题:
- 字段引用未指定表名存在歧义:多表关联场景下,
group、having中直接写字段名,数据库无法判断属于reservations还是orders表,会抛出字段不明确的报错。 - 低级拼写错误:日期筛选条件中的
fistMonthDay应为firstMonthDay,会导致日期范围筛选完全失效。 - 关联逻辑隐式依赖版本规则:include中加where条件默认会走内连接,但不同Sequelize版本可能存在行为差异,显式指定
required: true可以保证和你原生SQL的内连接逻辑完全一致。 - 可选对齐调整:如果要完全匹配你写的原生SQL,可将count的统计字段从
reservationId改为reservationDate,两者统计结果完全一致,仅和预期SQL写法对齐。
修正后的查询代码:
db.Reservations.findAll({ attributes: ['reservationDate'], where: { reservationDate: { [Sequelize.Op.between]: [firstMonthDay, lastMonthDay], // 修正拼写错误 }, }, include: [{ model: db.Orders, attributes: [], where: { confirmed: true }, required: true // 显式指定内连接,避免版本差异导致逻辑异常 }], group: ['reservations.reservationDate'], // 显式指定表名,解决字段歧义 having: { [Sequelize.fn("COUNT", Sequelize.col("reservations.reservationDate"))]: { [Sequelize.Op.gte]: 30, } } })
上述代码生成的SQL逻辑和你给出的预期原生SQL完全匹配,额外保留了你添加的当月日期范围筛选逻辑。
内容的提问来源于stack exchange,提问作者Ivan Taccadoli
相关产品推荐
相关产品推荐

