sql >> Base de Datos >  >> RDS >> Mysql

¿Es posible hacer una subconsulta con Sequelize.js?

No creo que sea posible una respuesta clara a tu pregunta. Ver #1869 :

Para responder a la pregunta del título, Sequelize generará automáticamente una subconsulta (por ejemplo, #1719 ), pero no puede hacer una subconsulta personalizada. No tengo una referencia autorizada para un negativo.

Parece que tu tabla es algo como esto:

EssayStats
    EssayId
    EssayDate
    WordCount

Entonces podrías hacer algo como esto:

return EssayStat.findAll({
    attributes: [
        [sequelize.literal('((SELECT wordCount FROM "EssayStats" WHERE "EssayId" = "EssayStat"."EssayId" EssayStat BY "createdAt" DESC LIMIT 1) - (SELECT wordCount FROM "EssayStats" WHERE "EssayId" = "EssayStat"."EssayId" EssayStat BY "createdAt" ASC LIMIT 1))'), 'difference'],
        'EssayId'
    ],
    group: ['EssayId']
});

Todo lo que está haciendo es ejecutar dos consultas SELECT, tomando el MAX y MIN de esas consultas después de ordenar por su variable de interés y luego tomando su diferencia. Eso le dará lo que le interesa:la diferencia de recuento de palabras entre la versión más reciente y la primera versión.

El truco aquí es encapsular una instrucción SELECT en un campo de atributo.

Por supuesto, es muy complicado y probablemente no sea mucho mejor que el sequelize.query enlatado. . Pero responde a la esencia de su pregunta.

Una mejor solución podría ser desnormalizar algunos datos y almacenar "wordCountDelta" en su modelo de Ensayo directamente. Entonces podrías tener un afterCreate gancho para actualizar automáticamente el campo. Lo más probable es que también sea la solución más rápida.

Respondí algo similar aquí .