Jeg tror ikke, at et klart svar på dit spørgsmål er muligt. Se #1869 :
For at besvare titelspørgsmålet genererer Sequelize automatisk en underforespørgsel (f.eks. #1719 ), men du kan ikke lave en tilpasset underforespørgsel. Jeg har ikke en autoritativ reference for en negativ.
Det ser ud til, at dit bord er sådan her:
EssayStats
EssayId
EssayDate
WordCount
Så kunne du gøre sådan noget:
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']
});
Alt, hvad det gør, er at køre to SELECT-forespørgsler, tage MAX og MIN fra disse forespørgsler efter bestilling efter din variabel af interesse, og derefter tage din forskel. Det vil give dig det, du er interesseret i:forskellen mellem ordtal mellem den seneste version og den første version.
Tricket her er at indkapsle en SELECT-sætning i et attributfelt.
Selvfølgelig er det rodet for pokker og sandsynligvis ikke så meget bedre end den konserverede sequelize.query
. Men det besvarer essensen af dit spørgsmål.
En bedre løsning kan være at denormalisere dine data noget og gemme "wordCountDelta" i din Essay-model direkte. Så kunne du have en afterCreate
hook
for automatisk at opdatere feltet. Det ville højst sandsynligt også være den hurtigste løsning.
Jeg svarede på noget lignende her .