使用 Sequelize 包含子句查询在另一个表中没有条目的记录
Posted
技术标签:
【中文标题】使用 Sequelize 包含子句查询在另一个表中没有条目的记录【英文标题】:Query records that does not have an entry in another table using Sequelize include clause 【发布时间】:2019-11-16 03:31:30 【问题描述】:给定用户表和评分表
如何从 Users 表中查询所有在 Ratings 表中没有评分记录的用户记录使用 Sequelize 包含子句
注意:续集版本 5.x
提前致谢
【问题讨论】:
【参考方案1】:您可以通过两种方式执行此操作,具体取决于您的模型是如何定义的。
1. 使用Sequelize Eager Loading 获取所有Users
和Ratings
。然后过滤用户没有任何评分的地方。
const users = Users.findAll(
include: [Ratings]
);
const filteredUsers = users.filter(user => user.ratings.length === 0);
2. 从Ratings
表中获取所有userIds
,然后使用notIn
Sequelize operator 将这些userIds
传递给where 子句
const ratings = Ratings.findAll(
attributes: ["userId"],
group: ["userId"]
);
const userIds = ratings.map(rating => rating.userId);
const filteredUsers = Users.findAll(
where:
userId: [Op.notIn]: userIds
);
【讨论】:
这正是我不喜欢续集的原因【参考方案2】:尝试在 where 子句中加入 sequelize 文字:
const ratings = Ratings.findAll(
attributes: ["userId"],
group: ["userId"],
where:
$and: [
sequelize.literal(`NOT EXISTS (
SELECT 1 FROM Ratings r
WHERE r.userId = User.id
)`),
],
,
);
【讨论】:
以上是关于使用 Sequelize 包含子句查询在另一个表中没有条目的记录的主要内容,如果未能解决你的问题,请参考以下文章
如何使用带有 Sequelize 的 EXISTS 子句进行查询?