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

如何使用Sequelize实现多字段条件查询?

问题分析与解决方案

你的写法为什么不生效

你当前的查询逻辑存在矛盾:要求同一条记录的skill字段同时等于'IDE'和'REST',这在单条记录里不可能实现,所以查询永远返回空结果,自然看起来“无法生效”。

正确实现方式(分场景)

场景1:单条记录对应一个技能(如user_skills表,每条记录存用户ID、技能名、时长)

这种场景下要找同时拥有两个达标技能的用户,有两种常用实现方式:

方式1:使用EXISTS子查询

where: {
  [Op.and]: [
    {
      [Op.exists]: sequelize.literal(`
        SELECT 1 FROM user_skills us 
        WHERE us.user_id = users.id 
        AND us.skill = 'IDE' 
        AND us.months >= 28
      `)
    },
    {
      [Op.exists]: sequelize.literal(`
        SELECT 1 FROM user_skills us 
        WHERE us.user_id = users.id 
        AND us.skill = 'REST' 
        AND us.months >= 20
      `)
    }
  ]
}

方式2:使用GROUP BY + HAVING聚合

User.findAll({
  include: [
    {
      model: UserSkill,
      where: {
        [Op.or]: [
          { skill: 'IDE', months: { [Op.gte]: 28 } },
          { skill: 'REST', months: { [Op.gte]: 20 } }
        ]
      },
      required: true
    }
  ],
  group: ['User.id'],
  having: sequelize.where(sequelize.fn('COUNT', sequelize.col('UserSkills.id')), '=', 2)
})

场景2:单条记录包含多个技能字段(如users表有ide_months、rest_months等字段)

这种场景直接指定对应字段的条件即可:

where: {
  ide_months: { [Op.gte]: 28 },
  rest_months: { [Op.gte]: 20 }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 11:55:16