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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 12:39:03