sql >> Database >  >> RDS >> Mysql

Is het mogelijk om een ​​subquery te doen met Sequelize.js?

Ik denk niet dat een duidelijk antwoord op je vraag mogelijk is. Zie #1869 :

Om de titelvraag te beantwoorden, genereert Sequelize automatisch een subquery (bijv. #1719 ), maar u kunt geen aangepaste subquery uitvoeren. Ik heb geen gezaghebbende referentie voor een negatief.

Het lijkt erop dat uw tafel er ongeveer zo uitziet:

EssayStats
    EssayId
    EssayDate
    WordCount

Dan zou je zoiets als dit kunnen doen:

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

Het enige dat het doet, is twee SELECT-query's uitvoeren, de MAX en MIN van die query's nemen na het bestellen op uw variabele van belang, en vervolgens uw verschil nemen. Dat geeft je waar je in geïnteresseerd bent:het verschil in aantal woorden tussen de meest recente versie en de eerste versie.

De truc hier is om een ​​SELECT-instructie in een attribuutveld in te kapselen.

Natuurlijk is het rommelig en waarschijnlijk niet zo veel beter dan de ingeblikte sequelize.query . Maar het beantwoordt wel de kern van je vraag.

Een betere oplossing zou kunnen zijn om uw gegevens wat te denormaliseren en "wordCountDelta" rechtstreeks in uw Essay-model op te slaan. Dan zou je een afterCreate . kunnen hebben haak om het veld automatisch bij te werken. Dat zou waarschijnlijk ook de snelste oplossing zijn.

Ik antwoordde hier .



  1. Paging met Oracle

  2. pyodbc op google colab

  3. Wat is de beste manier om de bijbel in SQL op te slaan?

  4. Hoe haal ik decimalen op bij het afronden van een gemiddelde in SQL?