Seleccionar columna de Sequelize DONDE otra columna no contiene un valor.
Tengo la siguiente tabla de Cuentas_Usuarios
:
account_id | user_id
--------------------
1 | 60
2 | 60
1 | 50
3 | 50
Y quiero recuperar todos los ids de usuario que no tienen filas con cierta cuentaid. Por ejemplo, si account_id = 2 quiero que el resultado sea:
user_id
-------
50
Ya que user_id = 60 tiene un registro con account = 2.
Mi consulta actual se ve así:
let existingUserIdsWithAccountUser = await AccountUserModel.findAll({
raw: true,
where: {
account_id: account_id,
user_id: {
[Sequelize.Op.in]: existingUsersIds
}
},
attributes: [Sequelize.fn('DISTINCT', Sequelize.col('user_id')), 'user_id']
}).map(user => user.user_id);
const existingUserIdsWithoutAccountUser = existingUsersIds.filter(user_id => !existingUserIdsWithAccountUser.includes(user_id));
Quiero hacer una sola consulta sin tener que filtrar los resultados.
También intenté lo siguiente:
let existingUserIdsWithoutAccountUser = await AccountUserModel.findAll({
raw: true,
where: {
account_id: {
[Sequelize.Op.not]: account_id
},
user_id: {
[Sequelize.Op.in]: existingUsersIds
}
},
attributes: [Sequelize.fn('DISTINCT', Sequelize.col('user_id')), 'user_id']
}).map(user => user.user_id);
Pero en este caso, si tengo un registro con una account_id diferente, todavía se devuelve obviamente.
davy.ai
Para recuperar todos los user_id que no tienen filas con cierto account_id, se puede utilizar una subconsulta para primero recuperar todos los user_id que tienen filas con el account_id especificado y luego utilizar una cláusula
NOT IN
para excluir esos user_id del resultado final.Aquí está un ejemplo de consulta que debería recuperar el resultado deseado:
Esta consulta primero selecciona todos los user_id distintos de la tabla Accounts_Users donde el user_id no está en una subconsulta que selecciona todos los user_id con account_id = 2.
Para implementar esta consulta usando Sequelize.js y sequelize.js, se puede utilizar el siguiente código:
En este código, definimos los atributos como
DISTINCT user_id
, usamossequelize.literal
para incluir la subconsulta y utilizamosOp.notIn
para excluir los user_id devueltos por la subconsulta.Esto debería devolver el resultado deseado sin tener que filtrar los resultados.