如何用Sequelize实现含聚合子查询的JOIN查询
解决方案
要实现你需要的JOIN聚合子查询的SQL,不能直接用默认的include关联Two模型,需要手动定义一个虚拟的子查询表进行关联,具体代码如下:
models.One.findAll({ include: [ { // 定义匹配子查询结果结构的虚拟模型 model: models.sequelize.define('table_two', { count: models.DataTypes.INTEGER, two_id: models.DataTypes.INTEGER }, { timestamps: false }), as: 'table_two', required: true, // 对应SQL中的INNER JOIN // 指定JOIN关联条件 on: models.sequelize.where( models.sequelize.col('one.two_id'), '=', models.sequelize.col('table_two.two_id') ), attributes: [], // 不需要返回虚拟表的字段(按需调整) // 配置数据源为聚合子查询 from: [ models.Sequelize.literal(`(SELECT COUNT(*) AS count, two_id FROM two GROUP BY two_id) AS table_two`) ] } ], subQuery: false, // 强制生成JOIN语法,避免嵌套子查询,符合性能要求 raw: true // 可选:若需要返回原始数据而非模型实例则开启 });
关键说明
- 虚拟模型
table_two仅用于匹配子查询的字段结构,无需实际建表 from字段通过literal直接嵌入你需要的聚合子查询SQLsubQuery: false是核心配置,确保Sequelize生成你期望的JOIN形式而非嵌套子查询
内容的提问来源于stack exchange,提问作者Plotisateur
相关产品推荐
相关产品推荐

