是否可以使用 Sequelize.js 进行子查询?

本教程将介绍是否可以使用 Sequelize.js 进行子查询?的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

是否可以使用 Sequelize.js 进行子查询? 教程 第1张

问题描述

我的查询看起来像:

select es.EssayId, (esmax.WordCount - esmin.WordCount)
from (select es.EssayId, min(es.EssayDate) as mined, max(es.EssayDate) as maxed
from EssayStats es
group by es.EssayId
  ) es join
  EssayStats esmin
  on es.EssayId = esmin.EssayId and es.mined = esmin.EssayDate join
  EssayStats esmax
  on es.EssayId = esmax.EssayId and es.maxed = esmax.EssayDate;

是否可以用 Sequelize.js ORM 编写这个?我知道我可以直接使用 query,但我想知道是否可以构造.

推荐答案

我认为您的问题不可能得到明确的答案.参见#1869:

不幸的是,目前无法查询直通模型/连接表.

为了回答标题问题,Sequelize 会自动生成一个子查询(例如,#1719),但您不能执行自定义子查询.我没有权威的否定参考.

看起来你的桌子是这样的:

EssayStats
 EssayId
 EssayDate
 WordCount

然后你可以这样做:

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

它所做的只是运行两个 SELECT 查询,在按您感兴趣的变量排序后从这些查询中获取 MAX 和 MIN,然后获取您的差异.这将为您提供您感兴趣的内容:最新版本和第一个版本之间的字数差异.

这里的诀窍是在属性字段中封装一个 SELECT 语句.

当然,它很混乱,可能并不比罐装的 sequelize.query 好多少.但它确实回答了你问题的要点.

更好的解决方案可能是对您的数据进行一些非规范化处理,并将wordCountDelta"直接存储在您的 Essay 模型中.然后你可以有一个 afterCreate hook自动更新字段.这很可能也是最快的解决方案.

我在这里回答了类似的问题.

好了关于是否可以使用 Sequelize.js 进行子查询?的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。