Non credo sia possibile una risposta chiara alla tua domanda. Vedi #1869 :
Per rispondere alla domanda del titolo, Sequelize genererà automaticamente una sottoquery (ad es. #1719 ), ma non è possibile eseguire una sottoquery personalizzata. Non ho un riferimento autorevole per un negativo.
Sembra che il tuo tavolo sia qualcosa del genere:
EssayStats
EssayId
EssayDate
WordCount
Quindi potresti fare qualcosa del genere:
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']
});
Tutto ciò che sta facendo è eseguire due query SELECT, prendere MAX e MIN da quelle query dopo aver ordinato in base alla variabile di interesse e quindi prendere la differenza. Questo ti darà ciò che ti interessa:la differenza di conteggio delle parole tra la versione più recente e la prima versione.
Il trucco qui è incapsulare un'istruzione SELECT in un campo di attributo.
Ovviamente, è disordinato e probabilmente non molto meglio del sequelize.query
in scatola . Ma risponde al succo della tua domanda.
Una soluzione migliore potrebbe essere quella di denormalizzare alcuni dati e memorizzare direttamente "wordCountDelta" nel modello Essay. Quindi potresti avere un afterCreate
hook
per aggiornare automaticamente il campo. Molto probabilmente sarebbe anche la soluzione più veloce.
Ho risposto a qualcosa di simile qui .