使用 Sequelize 模型 Sequelize Op.notIn

时间:2021-04-21 09:38:31

标签: javascript mysql node.js sequelize.js

你好,我有一个 mysql 查询,它在 sequelize.query 中工作正常,查询是

select list_name from lists l where l.list_id not in
(SELECT sub.list_id from list_sub_activities sub left join.
 Activities a on a.list_act_id = sub.list_act_id where a.agency_id = 2)

我想使用 sequelize 模型做同样的事情,我已经尝试过,但我想我错过了一些东西。

包列表--->列表

List_of_Packages.findAll({
  attributes: ['list_name'],
  where: {
    list_id: {
      [Op.notIn]: [List_sub_Activities.findAll({
        attributes: ['list_id'],
        include: {
          model: Activities,
          required: false,
          where: {
            agency_id: 2
          }
        }
      })
      ]
    }
  }


}).then((response) => {
  console.log(response);
})

如果你帮助我,我很感激。

谢谢!!!

1 个答案:

答案 0 :(得分:1)

findAll()(和其他查询方法)是异步的,因此您需要先解析 promise(或使用回调)来解析值,然后才能将 list_id 传递给 {{1 }}。它还将返回一个属性为 Op.notInobjects 数组,因此您需要先将其映射到一个整数数组,然后才能使用它。您还可以传入 list_id,这样它就不会从您的结果中生成 Sequelize Instances,而是返回普通的 javascript 对象 - 这比创建对象只是为了获取单个属性更有效。

通过在 raw: true 包含设置 required: false,您将返回所有 Activities 而不会过滤它们(有些在您的结果中将为空)。这可能不是您想要的。

为了清楚起见,此示例使用 List_sub_Activities 而不是 async/await。请注意,这不是最有效,因为它需要多个数据库查询,理想的解决方案是使用 thenables 然后删除 LEFT JOIN 所在的项目(参见第二个示例).

package.list_id IS NULL

使用 thenables。


// get an array of Activities with the list_id set
const activities = await List_sub_Activities.findAll({
  attributes: ['list_id'],
  include: {
    model: Activities,
    // don't use required: false to only return results where List_sub_Activities.Activities is not null
    // required: false,
    where: {
      agency_id: 2,
    },
  },
  raw: true,
});

// map the property to an array of just the IDs
const activityIds = activities.map((activity) => activity.list_id);

// now you can pass the activityIds to Op.notIn
const packages = await List_of_Packages.findAll({
  attributes: ['list_name'],
  where: {
    list_id: {
      [Op.notIn]: activityIds,
    },
  },
});

这个例子LEFT JOINs List_sub_Activities.findAll(...) .then((activities) => activities.map((activity) => activity.list_id)) .then((activityIds) => List_of_Packages.findAll(...)) .then((packages) => { console.log(packages); }); to List_of_Packages JOINed to List_sub_Activities,WHERE将Activities设置为2,然后只返回来自agency_id的结果其中 List_of_PackagesList_sub_Activities.list_id(在 LEFT JOIN 上没有匹配)。这应该会在单个查询中返回与上述相同的结果。

NULL