是否可以使用 Sequelize.js 进行子查询?
本教程将介绍是否可以使用 Sequelize.js 进行子查询?的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。
问题描述
我的查询看起来像:
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 进行子查询?的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。