es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , , ,

Answer

  1. Avatar for 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:

    SELECT DISTINCT user_id
    FROM Accounts_Users
    WHERE user_id NOT IN (
      SELECT user_id
      FROM Accounts_Users
      WHERE account_id = 2
    );
    

    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:

    let existingUserIdsWithoutAccountUser = await AccountUserModel.findAll({
      raw: true,
      attributes: [[Sequelize.fn('DISTINCT', Sequelize.col('user_id')), 'user_id']],
      where: {
        user_id: {
          [Sequelize.Op.notIn]: sequelize.literal(
            `(SELECT user_id FROM Accounts_Users WHERE account_id = ${account_id})`
          ),
          [Sequelize.Op.in]: existingUsersIds
        }
      }
    }).map(user => user.user_id);
    

    En este código, definimos los atributos como DISTINCT user_id, usamos sequelize.literal para incluir la subconsulta y utilizamos Op.notIn para excluir los user_id devueltos por la subconsulta.

    Esto debería devolver el resultado deseado sin tener que filtrar los resultados.

Comments are closed.