Sequelize多对多关联查询:如何筛选关联Bar数量大于2的Foo记录
实现方式
你可以通过GROUP BY + HAVING的组合来筛选关联数量符合要求的记录,以下是两种常用写法:
写法1:筛选同时返回关联的bars数据
如果你需要保留每个Foo对应的bars数组内容,可以用如下写法:
// 先从sequelize引入需要的工具方法,也可以直接从你初始化的sequelize实例上取 const { Op, fn, col, where } = require('sequelize'); const foos = await Foo.findAll({ include: [{ model: Bar, as: 'bars', // 若不需要返回bar的具体字段,可以打开下面的注释提升查询性能 // attributes: [] }], // 按Foo的主键分组,PostgreSQL需要额外把返回的所有Bar字段也加入group数组 group: ['Foo.id'], // 筛选关联bar数量大于2的记录 having: where(fn('COUNT', col('bars.id')), '>', 2) });
写法2:仅筛选符合条件的Foo,不返回关联bars
如果你不需要返回关联的Bar数据,用子查询的方式性能更高,避免了大表JOIN的开销:
const { Op } = require('sequelize'); const foos = await Foo.findAll({ where: { id: { [Op.in]: sequelize.literal(`(SELECT foo_id FROM FooBar GROUP BY foo_id HAVING COUNT(bar_id) > 2)`) } } });
注意事项
你当前的Bar模型关联配置里as属性写的是bars,属于笔误,建议改成foos,避免后续查询Bar关联Foo的时候出现别名冲突。
内容的提问来源于stack exchange,提问作者mdmb
相关产品推荐
相关产品推荐

