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

如何在Sequelize中使用join,将指定原生SQL转换为Sequelize查询

原生SQL转Sequelize查询实现方案

首先修正你提供的SQL笔误,完整的原生SQL逻辑如下:

SELECT 
  s.uid,
  s.NAME,
  u.NAME as fname
FROM users u
INNER JOIN s
ON s.uid = u.id
WHERE s.cid = 300;

第一步:定义模型并配置关联

你需要先定义两个表对应的Sequelize模型,并且配置好关联关系:

1. 定义User模型(对应users表)

const { DataTypes } = require('sequelize');
const User = sequelize.define('User', {
  id: {
    type: DataTypes.INTEGER,
    primaryKey: true
  },
  name: {
    type: DataTypes.STRING,
    field: 'NAME' // 和数据库实际字段名对齐
  }
}, {
  tableName: 'users',
  timestamps: false // 表无createAt、updateAt字段时需关闭
});

2. 定义S模型(对应s表)

const S = sequelize.define('S', {
  uid: DataTypes.INTEGER,
  name: {
    type: DataTypes.STRING,
    field: 'NAME'
  },
  cid: DataTypes.INTEGER
}, {
  tableName: 's',
  timestamps: false
});

3. 配置关联关系

// User表和S表一对多关联,关联别名设为s
User.hasMany(S, {
  foreignKey: 'uid',
  sourceKey: 'id',
  as: 's'
});

第二步:编写Sequelize查询语句

const result = await User.findAll({
  // 指定要查询的字段
  attributes: [
    [sequelize.col('s.uid'), 'uid'],
    [sequelize.col('s.NAME'), 's_name'],
    ['NAME', 'fname']
  ],
  // 关联查询配置
  include: [{
    model: S,
    as: 's',
    attributes: [], // 不需要返回关联对象的全部字段,设为空
    required: true, // 开启后为INNER JOIN,默认是LEFT JOIN
    where: {
      cid: 300
    }
  }],
  raw: true // 直接返回JSON数据,不需要Sequelize实例对象时可加
});

注意事项

  • 如果你的表字段大小写规则、模型命名和示例不同,需要对应调整配置
  • 如果你想从S模型出发做关联查询,只需要把关联关系改成S.belongsTo(User, {foreignKey: 'uid', as: 'u'}),再调整查询的主模型和include配置即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 14:45:02