如何在Sequelize中使用distinct实现带having条件的分组查询
Sequelize 实现指定SQL查询的正确方案
// 首先确保导入所需依赖 const { Op } = require('sequelize'); Users.findNewID = async function (userIds) { // 注:代码中的sequelize需替换为你项目中实际初始化的Sequelize实例对象 const newID = await Users.findOne({ // 仅返回需要的messID字段,和原生SQL逻辑对齐 attributes: ['messID'], where: { // 对应SQL的userID IN (?)逻辑,原Op.contains使用错误 userID: { [Op.in]: userIds } }, group: ['messID'], having: sequelize.where( // 嵌套fn实现COUNT(DISTINCT userID)的聚合逻辑 sequelize.fn('COUNT', sequelize.fn('DISTINCT', sequelize.col('userID'))), '=', userIds.length ) }); return newID; };
核心修改说明
- 修正where查询条件:原代码使用的
Op.contains适用于字段为数组类型、判断字段是否包含指定值的场景,你的需求是匹配userID在userIds数组内,因此改用Op.in实现SQL的IN逻辑 - 新增
attributes配置:指定仅返回messID字段,避免返回多余数据 - 修正
group参数格式:统一用字符串数组声明分组字段,避免变量未定义报错 - 新增
having配置:通过嵌套sequelize.fn方法实现去重计数的聚合逻辑,直接和userIds的长度做等值匹配
如果需要获取所有符合条件的messID,把findOne改为findAll即可。
内容的提问来源于stack exchange,提问作者Josh Susa
相关产品推荐
相关产品推荐

