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

Sequelize中如何基于已定义模型实现两表Inner Join内连接查询

Sequelize 实现非原生SQL的Inner Join查询方案

前置要求

Sequelize 做关联查询必须提前定义模型间的关联关系,直接调用查询方法无法生成JOIN语句。

步骤1:定义模型关联

找到项目中统一加载模型、初始化关联的文件(通常是数据库连接的index.js,也可以在两个模型定义完成后直接编写),添加1:1关联配置,匹配你需要的t1.id = t2.id关联条件:

import Table1 from './table1.model.js'
import Table2 from './table2.model.js'

// 以Table2为查询主表,关联Table1
Table2.hasOne(Table1, {
  foreignKey: 'id', // 关联目标表Table1的匹配字段
  sourceKey: 'id' // 用当前表Table2的id字段做等值匹配
})

如果后续需要从Table1反向关联查询Table2,可以补充Table1.belongsTo(Table2, { foreignKey: 'id', targetKey: 'id' }),本次查询不需要配置。


步骤2:编写Inner Join查询代码

Sequelize中include配置项的required: true参数就对应INNER JOIN逻辑(默认值false对应LEFT JOIN),直接调用findAll方法即可:

const queryResult = await Table2.findAll({
  // 主表Table2(对应SQL里的t2)要返回的字段:注意email字段在Table1上,不要写在这里
  attributes: ['number', 'status'],
  // 查询条件:你示例SQL里的t2.email是笔误,根据给出的表结构email属于Table1
  where: {
    '$table_1.email$': 'test.test@test.com'
  },
  include: [
    {
      model: Table1,
      // 关联表Table1(对应SQL里的t1)要返回的字段
      attributes: ['id', 'name', 'email'],
      required: true // 核心配置:开启后自动生成INNER JOIN
    }
  ],
  raw: true // 可选:加上后返回结果为打平的单层对象,和原生SQL返回结构一致;不加则返回嵌套结构
})

补充说明

  • 如果定义关联时加了as自定义别名,比如Table2.hasOne(Table1, { as: 't1Info', ... }),include块必须同步添加as: 't1Info',字段过滤路径也要对应改成$t1Info.email$
  • 关联表的过滤条件除了写在顶层where用$关联路径.字段$的方式,也可以直接写在include块的where配置里,生成的SQL完全一致
  • 不加raw: true时,返回结构为嵌套格式:{ number: '', status: '', table_1: { id: '', name: '', email: '' } },根据业务场景选择是否开启即可

内容的提问来源于stack exchange,提问作者DayIsGreen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 11:48:16