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

Er det muligt at lave en underforespørgsel med Sequelize.js?

Jeg tror ikke, at et klart svar på dit spørgsmål er muligt. Se #1869 :

For at besvare titelspørgsmålet genererer Sequelize automatisk en underforespørgsel (f.eks. #1719 ), men du kan ikke lave en tilpasset underforespørgsel. Jeg har ikke en autoritativ reference for en negativ.

Det ser ud til, at dit bord er sådan her:

EssayStats
    EssayId
    EssayDate
    WordCount

Så kunne du gøre sådan noget:

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

Alt, hvad det gør, er at køre to SELECT-forespørgsler, tage MAX og MIN fra disse forespørgsler efter bestilling efter din variabel af interesse, og derefter tage din forskel. Det vil give dig det, du er interesseret i:forskellen mellem ordtal mellem den seneste version og den første version.

Tricket her er at indkapsle en SELECT-sætning i et attributfelt.

Selvfølgelig er det rodet for pokker og sandsynligvis ikke så meget bedre end den konserverede sequelize.query . Men det besvarer essensen af ​​dit spørgsmål.

En bedre løsning kan være at denormalisere dine data noget og gemme "wordCountDelta" i din Essay-model direkte. Så kunne du have en afterCreate hook for automatisk at opdatere feltet. Det ville højst sandsynligt også være den hurtigste løsning.

Jeg svarede på noget lignende her .



  1. MySQL-indeks for MIN og MAX

  2. transponer rækker til kolonner i sql

  3. MySQL tæt rang for hver gruppe/partition

  4. MySQL Update Query ved hjælp af en venstre joinforbindelse