Mysql
 sql >> Database >  >> RDS >> Mysql

È possibile eseguire una sottoquery con Sequelize.js?

Non credo sia possibile una risposta chiara alla tua domanda. Vedi #1869 :

Per rispondere alla domanda del titolo, Sequelize genererà automaticamente una sottoquery (ad es. #1719 ), ma non è possibile eseguire una sottoquery personalizzata. Non ho un riferimento autorevole per un negativo.

Sembra che il tuo tavolo sia qualcosa del genere:

EssayStats
    EssayId
    EssayDate
    WordCount

Quindi potresti fare qualcosa del genere:

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']
});

Tutto ciò che sta facendo è eseguire due query SELECT, prendere MAX e MIN da quelle query dopo aver ordinato in base alla variabile di interesse e quindi prendere la differenza. Questo ti darà ciò che ti interessa:la differenza di conteggio delle parole tra la versione più recente e la prima versione.

Il trucco qui è incapsulare un'istruzione SELECT in un campo di attributo.

Ovviamente, è disordinato e probabilmente non molto meglio del sequelize.query in scatola . Ma risponde al succo della tua domanda.

Una soluzione migliore potrebbe essere quella di denormalizzare alcuni dati e memorizzare direttamente "wordCountDelta" nel modello Essay. Quindi potresti avere un afterCreate hook per aggiornare automaticamente il campo. Molto probabilmente sarebbe anche la soluzione più veloce.

Ho risposto a qualcosa di simile qui .