可以用Sequelize.js做一个子查询吗?

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,但我想知道是否可以构建.

srl*_*rlm 6

我认为您的问题不可能有一个明确的答案。见#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