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

如何在Node.js的Sequelize中实现嵌套IN子查询(不使用原生查询)

在Sequelize中实现嵌套IN子查询(非原生查询)

首先确保你已经定义好三个模型并配置了正确的关联:

  • WorkspaceMaster 与 ProjectMaster 是一对多关联:WorkspaceMaster.hasMany(ProjectMaster, { foreignKey: 'workspace_id' }),反向关联 ProjectMaster.belongsTo(WorkspaceMaster, { foreignKey: 'workspace_id' })
  • ProjectMaster 与 ItemMaster 是一对多关联:ProjectMaster.hasMany(ItemMaster, { foreignKey: 'project_id' }),反向关联 ItemMaster.belongsTo(ProjectMaster, { foreignKey: 'project_id' })

方法1:使用嵌套子查询(与原SQL结构一致)

通过 Op.in 结合子查询实现,完全对应原SQL的逻辑:

const { Op } = require('sequelize');

const targetItems = await ItemMaster.findAll({
  where: {
    project_id: {
      [Op.in]: ProjectMaster.findAll({
        attributes: ['id'], // 只查询需要的id字段
        where: {
          workspace_id: {
            [Op.in]: WorkspaceMaster.findAll({
              attributes: ['id'],
              where: { company_id: 4 },
              raw: true // 仅返回原始数据,优化性能
            })
          }
        },
        raw: true
      })
    }
  }
});

方法2:使用关联查询(JOIN方式)

利用Sequelize的关联特性,通过嵌套include实现过滤,最终生成的SQL会用JOIN替代子查询,部分场景下性能更优:

const targetItems = await ItemMaster.findAll({
  include: [
    {
      model: ProjectMaster,
      include: [
        {
          model: WorkspaceMaster,
          where: { company_id: 4 },
          required: true // 强制INNER JOIN,确保只返回符合条件的记录
        }
      ],
      required: true
    }
  ]
});

注意事项

  • 需确保模型关联的foreignKey与数据库字段完全匹配
  • Op.in必须从sequelize包中导入
  • 子查询中添加raw: true可以减少不必要的数据传输,提升查询效率

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 17:52:13