sql >> Databáze >  >> RDS >> Mysql

Je možné provést poddotaz pomocí Sequelize.js?

Nemyslím si, že jasná odpověď na vaši otázku je možná. Viz #1869 :

Pro zodpovězení titulkové otázky Sequelize automaticky vygeneruje dílčí dotaz (např. #1719 ), ale nemůžete provést vlastní poddotaz. Nemám směrodatnou referenci pro negativ.

Vypadá to, že váš stůl je něco takového:

EssayStats
    EssayId
    EssayDate
    WordCount

Pak můžete udělat něco takového:

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

Vše, co dělá, je spuštění dvou dotazů SELECT, přičemž z těchto dotazů po objednání podle proměnné, která vás zajímá, vezme MAX a MIN a poté vezme váš rozdíl. To vám dá to, co vás zajímá:rozdíl v počtu slov mezi nejnovější verzí a první verzí.

Trik je v tom zapouzdřit příkaz SELECT do pole atributu.

Samozřejmě je to špinavé a pravděpodobně ne o tolik lepší než konzervovaný sequelize.query . Ale odpovídá to na podstatu vaší otázky.

Lepším řešením by mohlo být denormalizovat svá data a uložit „wordCountDelta“ přímo do modelu Essay. Pak byste mohli mít afterCreate háček pro automatickou aktualizaci pole. To by s největší pravděpodobností bylo také nejrychlejší řešení.

Odpověděl jsem na něco podobného zde .



  1. Vysvětlení výkonu a úrovní služeb Azure SQL Database

  2. Jak přenést datum a čas na čas

  3. Jak spouštět uložené procedury s Doctrine2 a MySQL

  4. Count s LEFT JOIN zobrazuje pouze jeden řádek