Ik denk niet dat een duidelijk antwoord op je vraag mogelijk is. Zie #1869 :
Om de titelvraag te beantwoorden, genereert Sequelize automatisch een subquery (bijv. #1719 ), maar u kunt geen aangepaste subquery uitvoeren. Ik heb geen gezaghebbende referentie voor een negatief.
Het lijkt erop dat uw tafel er ongeveer zo uitziet:
EssayStats
EssayId
EssayDate
WordCount
Dan zou je zoiets als dit kunnen doen:
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']
});
Het enige dat het doet, is twee SELECT-query's uitvoeren, de MAX en MIN van die query's nemen na het bestellen op uw variabele van belang, en vervolgens uw verschil nemen. Dat geeft je waar je in geïnteresseerd bent:het verschil in aantal woorden tussen de meest recente versie en de eerste versie.
De truc hier is om een SELECT-instructie in een attribuutveld in te kapselen.
Natuurlijk is het rommelig en waarschijnlijk niet zo veel beter dan de ingeblikte sequelize.query
. Maar het beantwoordt wel de kern van je vraag.
Een betere oplossing zou kunnen zijn om uw gegevens wat te denormaliseren en "wordCountDelta" rechtstreeks in uw Essay-model op te slaan. Dan zou je een afterCreate
. kunnen hebben haak
om het veld automatisch bij te werken. Dat zou waarschijnlijk ook de snelste oplossing zijn.
Ik antwoordde hier .