Sha*_*oon 13 mysql 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;
Run Code Online (Sandbox Code Playgroud)
可以用Sequelize.js ORM写这个吗?我知道我可以直接使用query,但我想知道是否可以构建.
我认为您的问题不可能有一个明确的答案。见#1869:
不幸的是,目前无法查询直通模型/连接表。
要回答标题问题,Sequelize 会自动生成子查询(例如#1719),但您不能进行自定义子查询。我没有否定的权威参考。
看起来你的桌子是这样的:
EssayStats
EssayId
EssayDate
WordCount
Run Code Online (Sandbox Code Playgroud)
然后你可以做这样的事情:
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']
});
Run Code Online (Sandbox Code Playgroud)
它所做的就是运行两个 SELECT 查询,在按您感兴趣的变量排序后从这些查询中获取 MAX 和 MIN,然后获取差异。这将为您提供您感兴趣的内容:最新版本和第一个版本之间的字数差异。
这里的技巧是将 SELECT 语句封装在属性字段中。
当然,它太脏了,可能并不比罐头好多少sequelize.query。但它确实回答了你的问题的要点。
更好的解决方案可能是对您的数据进行一些非规范化,并直接在您的论文模型中存储“wordCountDelta”。然后你可以有一个afterCreate 钩子来自动更新该字段。这也很可能是最快的解决方案。
小智 5
子查询示例
ModelA.findAll({
where: {
$or: [
{'$B.someColumn$' : someCondition},
{'$C.someOtherColumn$' : someOtherCondition}
]
},
include: [{
model: ModelB,
required: false, //true or false for required
where:{id:$id}
}, {
model: ModelC,
required: false, //true or false for required
where:{id:$id}
}]
});
Run Code Online (Sandbox Code Playgroud)
我希望有用 :D
| 归档时间: |
|
| 查看次数: |
6456 次 |
| 最近记录: |