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.

sequelize: Especificando atributos para consultas SELECT mientras se utiliza un inner join

Quiero obtener de la tabla principal “cuenta” y compararla con el historial de cuentas. Hay una relación de uno a muchos entre las dos tablas.

SELECT cuenta."nombreDeUsuario", (cuenta."numeroDePublicaciones" - historialCuentas."numeroDePublicaciones") AS numeroDePublicaciones
    FROM public."Cuentas" AS cuenta INNER JOIN public."HistorialCuentas" AS historialCuentas
    ON cuenta."nombreDeUsuario" = historialCuentas."nombreDeUsuario" 
    WHERE historialCuentas."fechaDeExtracción" = '2022-01-08 23:59:39+01'
    ORDER BY numeroDePublicaciones DESC;

Mi pregunta es: ¿cómo puedo hacer esta consulta con Sequelize? Lo intenté, pero no pude cambiar el nombre del atributo y hacer la resta.

await this.accountRepository.findAll({    
    where: {'$accountHistory.createdAt$': '2022-01-08 23:59:39+01'},
    include: [{
      model: AccountHistory,
      required: false
    }],
    attributes: ['nombreDeUsuario', ['Sequelize.literal(accountHistory.numeroDePublicaciones - cuenta.numeroDePublicaciones)', 'numeroDePublicaciones'], 'numeroDePublicaciones'],
    order: [['createdAt', 'DESC']],
})
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para realizar la consulta con Sequelize, puedes utilizar el siguiente código:

    const { Op } = require('sequelize');
    
    const accounts = await Account.findAll({
      attributes: [
        'userName',
        [
          Sequelize.literal(`"Accounts"."postNumber" - "AccountHistories"."postNumber"`),
          'postNumberDiff',
        ],
      ],
      include: {
        model: AccountHistory,
        attributes: [],
        where: {
          scrappingDate: {
            [Op.eq]: new Date('2022-01-08 23:59:39+01'),
          },
        },
        required: true,
      },
      order: [
        [Sequelize.literal('"postNumberDiff"'), 'DESC'],
      ],
    });
    

    Explicación:

    • La constante Op es requerida para usar el operador Op.eq.
    • La opción attributes se utiliza para seleccionar las columnas que se incluirán en el resultado. La función Sequelize.literal() se utiliza para escribir código SQL personalizado para restar las dos columnas postNumber.
    • La opción include se utiliza para especificar el modelo AccountHistory y establecer una condición para filtrar por scrappingDate.
    • La opción required se establece en true para solo incluir cuentas que tengan un historial de cuenta correspondiente.
    • La opción order se utiliza para ordenar el resultado según la columna postNumberDiff en orden descendente.

    Nota: Esto asume que los modelos ya están definidos y las asociaciones están configuradas correctamente.

Comments are closed.