あなたの質問に対する明確な答えは不可能だと思います。 #1869 を参照してください :
タイトルの質問に答えるために、Sequelizeは自動的にサブクエリを生成します(例:#1719 )、ただし、カスタムサブクエリを実行することはできません。ネガティブについての信頼できる参照はありません。
テーブルは次のように見えます:
EssayStats
EssayId
EssayDate
WordCount
次に、次のようなことを行うことができます:
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']
});
実行しているのは、2つのSELECTクエリを実行し、対象の変数で並べ替えた後、それらのクエリからMAXとMINを取得し、次に差を取得することだけです。それはあなたが興味を持っているものをあなたに与えるでしょう:最新バージョンと最初のバージョンの間の単語数の違い。
ここでの秘訣は、SELECTステートメントを属性フィールドにカプセル化することです。
もちろん、それはひどく厄介で、おそらく缶詰のsequelize.query
よりもはるかに優れているわけではありません 。しかし、それはあなたの質問の要点に答えます。
より良い解決策は、データの一部を非正規化し、「wordCountDelta」をエッセイモデルに直接保存することです。次に、afterCreate
を作成できます。 フック
フィールドを自動的に更新します。それがおそらく最速の解決策になるでしょう。
こちら に似たような回答をしました 。