如何在TypeScript的Sequelize中关联查询关联表最新单条数据
在Sequelize(TypeScript)中实现分组取最新关联记录的查询
你的需求是给Table2按关联的Table1主键分组,取每组中DateTime最新的一条记录,再与Table1做INNER JOIN查询指定字段,以下是不使用原生query方法的对象式实现方案:
前提:模型关联已定义
假设你已经完成模型定义并建立了hasMany关联:
Table1.hasMany(Table2, { foreignKey: 'Table1Pk', sourceKey: 'Pk', as: 'Table2' // 关联别名,需与后续查询保持一致 });
查询实现代码
import { sequelize } from './your-sequelize-instance'; // 导入你的Sequelize实例 import { Table1, Table2 } from './your-models'; // 导入定义好的模型 async function fetchLatestAssociatedData() { // 构建Table2的子查询:按Table1Pk分组,取DateTime最新的第一条记录 const rankedTable2Subquery = sequelize.literal(`( SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY "Table1Pk" ORDER BY "DateTime" DESC) AS "RN" FROM "${Table2.tableName}" ) X WHERE X."RN" = 1 ) AS "Table2"`); // 执行关联查询 const queryResult = await Table1.findAll({ attributes: [ '"Table1"."Column"' // 指定Table1需要查询的字段 ], include: [{ model: Table2, as: 'Table2', // 必须与关联定义的别名匹配 attributes: [ '"Table2"."Column"' // 指定Table2需要查询的字段 ], required: true, // 启用INNER JOIN,对应原SQL的关联类型 from: rankedTable2Subquery, // 将子查询作为关联的数据源 on: sequelize.where( sequelize.col(`${Table1.tableName}.Pk`), '=', sequelize.col('Table2.Table1Pk') ) // 定义关联条件 }], raw: true, // 返回扁平化的原始数据对象,按需调整 nest: true // 可选:将关联数据嵌套到结果对象中,按需开启 }); return queryResult; }
关键说明
- 该方案完全基于Sequelize的对象式查询API,保留了后续扩展其他关联操作的灵活性,无需使用原生
query方法 rankedTable2Subquery封装了原SQL中的ROW_NUMBER分组逻辑,确保查询逻辑与原SQL完全一致required: true对应原SQL的INNER JOIN,若需要改为LEFT JOIN,将其设为false即可raw和nest参数可根据你需要的数据结构格式自行调整
内容的提问来源于stack exchange,提问作者Amit Kumar
相关产品推荐
相关产品推荐

