【发布时间】:2021-09-18 15:53:39
【问题描述】:
我有一个多对多的关系,如下所示:
var Genres = db.define('Movie', {
name: {
type: Sequelize.STRING(100),
allowNull: false
},
description: {
type:Sequelize.STRING(),
allowNull: true
},
thumbnail: {
type: Sequelize.BLOB(),
allowNull: true
},
urlposter: {
type: Sequelize.STRING(245),
allowNull: true
}
});
var Users = db.define('User', {
username: {
type: Sequelize.STRING(25),
allowNull: false
},
password: {
type: Sequelize.STRING(25),
allowNull: false
}
});
Movies.belongsToMany(Users, {through: UM, foreignKey: 'Id_Movies'});
Users.belongsToMany(Movies, {through: UM, foreignKey: 'Id_Users'});
我要做的是返回所有没有链接到特定用户的电影
这是我想要实现的 SQL 查询:
SELECT m.*
FROM Movies m
WHERE NOT EXISTS(SELECT NULL
FROM Users_Movies sc
WHERE sc.Id_Movies = m.id AND sc.Id_Users = 1)
这是我所拥有的最接近的,但这只会返回所有链接 u 用户 ID 为 1 的电影
Movies.findAll({
include: [
// {
// model:Genres,
// through:{attributes:[]}
// },
{
model:Users,
through:{attributes:[]},
where: {id: 1},
required: true,
}],
})
.then(function(movies){
done(null, movies);
})
.catch(function(error){
done(error, null);
});
但我想反转它。
现在我唯一的选择是进行 2 个查询,一个包含所有电影,一个包含所有具有链接的电影并循环遍历列表并将它们从第一个列表中删除。这不是漂亮的代码。
【问题讨论】:
-
你说你想得到所有电影没有链接到特定用户,但你说你想实现的 SQL 有
AND sc.Id_Users = 1。这是否与特定用户无关? -
不,不是……如果您运行它,它将返回所有与 id 为 1 的用户无关的电影
-
从包含的 Users 模型中删除
required: true并将where: {'Users.id': null}添加到查询中。我不确定确切的字段命名,但我想你已经明白了。
标签: javascript sql node.js sequelize.js