Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

É possível fazer uma subconsulta com o Sequelize.js?


Eu não acho que uma resposta clara à sua pergunta seja possível. Consulte #1869 :

Para responder à pergunta do título, o Sequelize gerará automaticamente uma subconsulta (por exemplo, #1719 ), mas você não pode fazer uma subconsulta personalizada. Eu não tenho uma referência oficial para um negativo.

Parece que sua tabela é algo assim:
EssayStats
    EssayId
    EssayDate
    WordCount

Então você poderia fazer algo assim:
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']
});

Tudo o que ele está fazendo é executar duas consultas SELECT, pegando o MAX e o MIN dessas consultas depois de ordenar por sua variável de interesse e, em seguida, tirar sua diferença. Isso lhe dará o que você está interessado:a diferença de contagem de palavras entre a versão mais recente e a primeira versão.

O truque aqui é encapsular uma instrução SELECT em um campo de atributo.

Claro, é confuso pra caramba e provavelmente não é muito melhor do que o sequelize.query enlatado . Mas responde à essência da sua pergunta.

Uma solução melhor pode ser desnormalizar alguns dados e armazenar "wordCountDelta" diretamente no seu modelo Essay. Então você poderia ter um afterCreate gancho para atualizar automaticamente o campo. Essa provavelmente seria a solução mais rápida também.

Eu respondi algo semelhante aqui .