我在使用 MySQL 的 NodeJS/Express/Angular7 应用程序中使用 Sequelize 5。
我有一个图像表,通过连接表与关键字表具有双向 hasMany 关系。
我想要查找在 ID 数组 [kewordsAnd] 中包含关键字 ID 的所有图像,排除在数组中包含关键字 ID 的图像以排除 [keywordsNot] .
现在的代码如下:
Image.findAll({
include: [ {
model: Keywords,
as: 'Keywords',
attributes: ['id', 'name'],
where: {
id: {
[Op.and]: [
{ [Op.in]: keywordsAnd },
{ [Op.notIn]: keywordsNot }
]
}
}
} ]
});
这会正确获取 keywordsAnd 数组中包含 ID 的所有图像,但 keywordsNot 数组会被完全忽略。
这是生成的 SQL(为了便于阅读而添加换行符)
const objectsAnd: [ 430 ]
const objectsNot: [ 779 ]
Executing (default):
SELECT `image`.`id`, `image`.`status`, `image`.`image_type`, `image`.`embed`,
`image`.`raw_path`, `image`.`thumb_path`, `image`.`detail_path`, `image`.`story_title`,
`image`.`image_title`, `image`.`original_filename`, `image`.`description`,
`image`.`geo_info`, `image`.`year_taken`, `image`.`credit_info`,
`image`.`width`, `image`.`height`, `image`.`format`, `image`.`duration`,
`image`.`created_at`
AS `createdAt`, `image`.`updated_at` AS `updatedAt`, `keywords`.`id` AS `keywords.id`,
`keywords`.`name` AS `keywords.name`, `keywords`.`created_at` AS `keywords.createdAt`,
`keywords`.`updated_at` AS `keywords.updatedAt`, `keywords->image_keywords`.`id` AS
`keywords.image_keywords.id`, `keywords->image_keywords`.`image_id` AS
`keywords.image_keywords.image_id`, `keywords->image_keywords`.`keyword_id` AS
`keywords.image_keywords.keyword_id`, `keywords->image_keywords`.`created_at` AS
`keywords.image_keywords.createdAt`, `keywords->image_keywords`.`updated_at` AS
`keywords.image_keywords.updatedAt`
FROM `image` AS `image` INNER JOIN ( `image_keywords` AS `keywords->image_keywords`
INNER JOIN `keywords` AS `keywords`
ON `keywords`.`id` = `keywords->image_keywords`.`keyword_id`)
ON `image`.`id` = `keywords->image_keywords`.`image_id`
AND (`keywords`.`id` IN (430) AND `keywords`.`id` NOT IN (779));
我不清楚这是否是我构建查询的方式的问题,或者是一个错误,或者是我对它应该如何工作的完全误解,但我真的希望得到一些指导。
最佳答案
根据下面的示例数据,您是否只期望得到图像 1(而不是图像 2)的结果?
image id keyword id
1 430
2 430
2 709
如果是这样,则问题出在您的查询上。您需要选择关键字 ID 为 709 的图片 ID,并将其用作 NOT IN 语句的基础。
关于mysql - Sequelize : How to make use of multiple operators to create a fetch of objects with an exclusion clause,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56047760/