如何通过Sequelize模型实现t1关联t2单条记录的查询?
使用Sequelize实现指定关联查询
当然可以实现,两种方式供你选择:
1. 直接执行原生SQL(最直接)
如果你不需要依赖模型关联的ORM特性,直接用原生查询完全匹配你想要的SQL:
const result = await sequelize.query(` SELECT * FROM t1 INNER JOIN (SELECT * FROM table2 ORDER BY field1 DESC LIMIT 1) t2 ON t1.f1 = t2.f1 `, { type: sequelize.QueryTypes.SELECT });
2. 通过模型关联实现
假设你已经定义了T1和Table2两个模型,可以通过子查询构建关联:
首先生成子查询的SQL语句,再将其作为临时表与T1关联:
// 生成子查询的SQL const subQuerySql = Table2.findAll({ attributes: ['*'], order: [['field1', 'DESC']], limit: 1 }).toSql(); // 执行关联查询 const result = await T1.findAll({ attributes: ['*'], include: [{ // 定义临时模型对应子查询结果 model: sequelize.define('t2', {}, { tableName: `(${subQuerySql}) t2`, timestamps: false }), required: true, // 对应INNER JOIN on: sequelize.where(sequelize.col('t1.f1'), '=', sequelize.col('t2.f1')) }], raw: true });
或者用更简洁的方式,利用Sequelize的子查询关联特性:
const result = await T1.findAll({ attributes: ['*'], include: [{ model: Table2, as: 't2', required: true, attributes: ['*'], // 只关联table2中最新的一条匹配记录 where: { f1: sequelize.col('t1.f1') }, order: [['field1', 'DESC']], limit: 1, subQuery: true }] });
这种方式会自动生成类似你目标SQL的关联逻辑,注意部分数据库方言对LIMIT在子查询中的支持差异。
内容的提问来源于stack exchange,提问作者d512
相关产品推荐
相关产品推荐

