Ich glaube nicht, dass eine klare Antwort auf Ihre Frage möglich ist. Siehe #1869 :
Um die Titelfrage zu beantworten, generiert Sequelize automatisch eine Unterabfrage (z. B. #1719 ). ), aber Sie können keine benutzerdefinierte Unterabfrage ausführen. Ich habe keine maßgebliche Referenz für ein Negativ.
Es sieht so aus, als ob Ihre Tabelle etwa so aussieht:
EssayStats
EssayId
EssayDate
WordCount
Dann könnten Sie so etwas tun:
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']
});
Alles, was es tut, ist, zwei SELECT-Abfragen auszuführen, MAX und MIN aus diesen Abfragen zu nehmen, nachdem es nach Ihrer interessierenden Variablen sortiert wurde, und dann Ihre Differenz zu nehmen. Das gibt Ihnen das, woran Sie interessiert sind:der Wortzahlunterschied zwischen der neuesten Version und der ersten Version.
Der Trick dabei ist, eine SELECT-Anweisung in ein Attributfeld zu kapseln.
Natürlich ist es verdammt chaotisch und wahrscheinlich nicht viel besser als die vorgefertigte sequelize.query
. Aber es beantwortet den Kern Ihrer Frage.
Eine bessere Lösung könnte darin bestehen, Ihre Daten etwas zu denormalisieren und "wordCountDelta" direkt in Ihrem Essay-Modell zu speichern. Dann könnten Sie ein afterCreate
haben Hook
um das Feld automatisch zu aktualisieren. Das wäre höchstwahrscheinlich auch die schnellste Lösung.
Etwas Ähnliches habe ich hier beantwortet .