You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 19:43:12