Jag tror inte att ett rent svar på din fråga är möjligt. Se #1869 :
För att svara på rubrikfrågan genererar Sequelize automatiskt en underfråga (t.ex. #1719 ), men du kan inte göra en anpassad underfråga. Jag har ingen auktoritativ referens för ett negativt.
Det ser ut som att ditt bord är ungefär så här:
EssayStats
EssayId
EssayDate
WordCount
Då kan du göra något så här:
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']
});
Allt som det gör är att köra två SELECT-frågor, ta MAX och MIN från dessa frågor efter att ha sorterat efter din variabel av intresse, och sedan ta din skillnad. Det ger dig det du är intresserad av:skillnaden i antal ord mellan den senaste versionen och den första versionen.
Tricket här är att kapsla in en SELECT-sats i ett attributfält.
Naturligtvis är det rörigt som fan och förmodligen inte så mycket bättre än den konserverade sequelize.query
. Men det svarar på kärnan i din fråga.
En bättre lösning kan vara att denormalisera dina data en del och lagra "wordCountDelta" i din uppsatsmodell direkt. Då kan du ha en afterCreate
hook
för att automatiskt uppdatera fältet. Det skulle med största sannolikhet också vara den snabbaste lösningen.
Jag svarade på något liknande här .