如何在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
相关产品推荐
相关产品推荐

