Ich glaube nicht, dass eine saubere Antwort auf Ihre Frage möglich ist. Siehe #1869:
Abfrage auf die Through Model/Join Tabelle ist derzeit leider nicht möglich.
die Titel Frage zu beantworten, Sequelize wird automatisch eine Unterabfrage (zB #1719) erzeugen, aber Sie können eine benutzerdefinierte Unterabfrage nicht. Ich habe keine verbindliche Referenz für ein Negativ.
Es ist wie Sie Ihren Tisch aussieht, ist so etwas wie dieses:
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 läuft zwei SELECT-Abfragen tut, Nehmen Sie die MAX und MIN aus diesen Abfragen nach der Bestellung durch Ihre Variable von Interesse, und nehmen Sie dann Ihre Differenz. Das gibt Ihnen das, woran Sie interessiert sind: Der Unterschied der Wortzahl zwischen der neuesten Version und der ersten Version.
Der Trick hier ist, eine SELECT-Anweisung in einem Attributfeld einzukapseln.
Natürlich ist es chaotisch und wahrscheinlich nicht so viel besser als die Dose sequelize.query
. Aber es beantwortet den Kern Ihrer Frage.
Eine bessere Lösung könnte sein, Ihre Daten etwas zu denormalisieren und "wordCountDelta" direkt in Ihrem Essay-Modell zu speichern. Dann könnten Sie eine afterCreate
hook haben, um das Feld automatisch zu aktualisieren. Das wäre höchstwahrscheinlich auch die schnellste Lösung.
Ich antwortete auf etwas ähnliches here.
Ich glaube nicht. Eager Laden kann die nächste Sache sein. [Hier ist ein Beispiel, in dem Sequelize eine Sub-Query durch eifriges Laden wegen eines künstlichen "Limits" erzeugt (https://github.com/sequelize/sequelize/issues/1719). – bishop
Ich weiß nichts über 'Sequelize.js'. Ist es möglich, etwas wie "EssayStats t1 LINKS JOIN EssayStats t2 ON t1.EssayId = t2.EssayId UND t1.EssayDate
axiac