如何使用 sequelize ORM 编写内连接查询?

Posted

技术标签:

【中文标题】如何使用 sequelize ORM 编写内连接查询?【英文标题】:How to write an Inner Join query using sequelize ORM? 【发布时间】:2021-04-11 17:30:34 【问题描述】:

我的内部连接查询如下所示

SELECT list.id, list.name,
sa.createdBy
FROM list 
INNER JOIN data sa 
               ON sa.listId = list.id 
WHERE sa.type = 'type1'
and sa.data = 'data1'

我正在尝试使用 sequelize ORM 编写上述查询。 我已经编写了以下查询,但它没有给出预期的结果。

list.findAll(
  include: [
    model: data,
    required: true
    where: type: 'type1'
   ]
).then(list => 
  /* ... */
);

【问题讨论】:

看看这个:***.com/q/55354324/10910692。虽然只有一个不被接受的答案,但我认为有一个关于如何加入的参考。似乎您只需要将第二个表放在 中,就像第一个表一样,并用逗号分隔。 【参考方案1】:

您的 where 子句未完全包含您编写的查询

list.findAll(
  include: [
    model: data,
    required: true,
    where: 
       type: 'type1', // sa.type = 'type1'
       data: 'data1', // sa.data = 'data1'
    ,
   ]
).then(lists =>  // renamed to lists to prevent shadowing the "list" model variable
  /* ... */
);

【讨论】:

我需要在哪里包含ON sa.listId = list.id?另外,如何获取sa.createdBy 如果您的data 表正确关联到模型定义中的list 表,那么“包含”会为您执行ON 部分。不知道你的list和data是一对一还是一对多的关系,但是如果你想让我看,你可以粘贴你的模型代码。现在,您的查询将带回两个表的所有属性,因此如果createdBydata 表中的一列,它应该存在。这取决于您的模型如何:一对一或一对多。我会为你展示每一个。 then(lists => if (lists.length) const first = lists[0]; const firstCreatedByOneToOne = first.data.createdBy; // one-to-one const firstCreatedByOneToMany = first.data[0].createdBy; // one-to-many, gets createdBy of first joined record );

以上是关于如何使用 sequelize ORM 编写内连接查询?的主要内容,如果未能解决你的问题,请参考以下文章

数据库连接池sequelize实现增删改查等操作

数据库连接池sequelize实现增删改查等操作

如何在 Sequelize ORM 中获取不带前缀表名的连接数据结果

Node.js,ORM框架,Sequelize,入门及增、删、改、查代码案例

[转]在node.js中,使用基于ORM架构的Sequelize,操作mysql数据库之增删改查

如何使用 Sequelize.js ORM 正确迁移 sqlite3 数据库?