Nie sądzę, aby jednoznaczna odpowiedź na twoje pytanie była możliwa. Zobacz #1869 :
Aby odpowiedzieć na tytułowe pytanie, Sequelize automatycznie wygeneruje podzapytanie (np. #1719 ), ale nie możesz wykonać niestandardowego podzapytania. Nie mam autorytatywnego odniesienia do negatywu.
Wygląda na to, że Twój stół wygląda mniej więcej tak:
EssayStats
EssayId
EssayDate
WordCount
Wtedy możesz zrobić coś takiego:
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']
});
Wszystko, co robi, to uruchamianie dwóch zapytań SELECT, pobranie MAX i MIN z tych zapytań po uporządkowaniu według interesującej Cię zmiennej, a następnie wzięcie różnicy. To da ci to, co cię interesuje:różnicę liczby słów między najnowszą wersją a pierwszą wersją.
Sztuczka polega na tym, aby umieścić instrukcję SELECT w polu atrybutu.
Oczywiście jest cholernie brudny i prawdopodobnie nie aż tak dużo lepszy niż puszka sequelize.query
. Ale odpowiada na sedno twojego pytania.
Lepszym rozwiązaniem może być denormalizacja danych i zapisanie „wordCountDelta” bezpośrednio w modelu Esej. Wtedy możesz mieć afterCreate
hak
aby automatycznie zaktualizować pole. Najprawdopodobniej byłoby to również najszybsze rozwiązanie.
Odpowiedziałem w podobny sposób tu .