Sequelize WHERE NOT EXISTS()

时间:2015-11-21 14:24:17

标签: javascript sql nodes sequelize.js

嗨我有很多关系看起来像这样:

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)

这是我最接近的,但这只是返回所有带有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次查询,对所有电影进行一次查询,并在列表中循环并将其从第一个列表中删除..这不是漂亮的代码。

1 个答案:

答案 0 :(得分:0)

我知道我对此事迟到了,但是我认为在查询的“ where”中使用文字“ users.id IS NULL ”将达到目的:

 Movie.findAll({
    where: sequelize.literal("users.id IS NULL"),
    include: [
      {
        model: Users,
        through: { attributes: [] }
      }],
  })
    .then(function (movies) {
      done(null, movies);
    })
    .catch(function (error) {
      done(error, null);   
    });

此解决方案基于以下Github问题:https://github.com/sequelize/sequelize/issues/4099