Продолжить запрос с предложением NOT IN и вложенным ВЫБОРОМ

#orm #sequelize.js

#orm #sequelize.js

Вопрос:

У меня есть SQL-запрос, который я хотел бы выразить, используя синтаксис запроса sequelize.

Схема БД

  • Пользователи: (идентификатор, имя пользователя, …)
  • Группы: (идентификатор, имя, …)
  • Группы пользователей: (id, #groupId, #userId)

Описание запроса

Извлеките всех пользователей, которые еще не являются частью определенной группы.

Необработанный SQL-запрос (рабочий)

 SELECT User.id, User.email FROM Users as User 
  WHERE User.id NOT IN (
    SELECT User_Group.userId FROM User_Groups as User_Group 
    WHERE User_Group.groupId = ${groupId}
  )
  

Где я заблокирован

Я попытался смоделировать соединение, используя оператор sequelize include , но мой мозг застрял, преобразуя вложенный запрос SELECT, а также NOT IN оператор…

Ответ №1:

Невозможно представить подзапросы, кроме использования Sequelize.literal в where предложении, подобном этому:

 const users = await database.User.findAll({
  where: Sequelize.where(Sequelize.literal(`(User.id NOT IN (
    SELECT User_Group.userId FROM User_Groups as User_Group 
    WHERE User_Group.groupId = '${groupId}'
  ))`)
}
  

или вы можете перепутать Op.notIn с Sequelize.literal

Комментарии:

1. Большое спасибо за указание Sequelize.literal опции. Это указало мне в правильном направлении и, наконец, на ограничение подзапросов в sequelize…