【问题标题】:Making a JOIN WHERE key IN(SELECT key FROM...) using Sequelize.js使用 Sequelize.js 创建一个 JOIN WHERE key IN(SELECT key FROM...)
【发布时间】:2019-05-16 11:17:33
【问题描述】:

我在 Sequelize.js 中是个菜鸟,在 Angular 中稍微少一些,但必须解决一个问题,我想使用子查询作为 JOIN 的条件。我在下面粘贴了一些示例,因为代码比文字更能说明问题。

SQL

INNER JOIN table ON table.key IN(SELECT current_key FROM historysnake WHERE original_key IN(
       SELECT original_key FROM historysnake WHERE current_key = table.key)
AND historysnake.model = 'tablename')

问题是:如何将上述查询放入 Sequelize 对象?比如:

Sequelize.js

var foo = sequelize.define('foo', {...}, {
    classMethods: {
        associate: function(models) {
            foo.hasMany(...)
        }
    }
});

【问题讨论】:

  • 您应该能够通过自加入关联来执行此操作,例如您将包含在table.findAll 中的HistorySnake.hasOne(HistorySnake, ....);。但是,您的 SQL 令人困惑:看起来 historySnake 的第二遍总是与第一遍匹配。你能详细说明一下吗?
  • 我将详细说明。我正在开发一个应用程序,护理人员可以在其中注册有关患者的信息。如果有人注册了一个事件,然后想要编辑该注册,则原始注册将被历史记录并创建一个新注册。所有这些注册都通过 Historysnake 与 current_key、previous_key 和 original_key 链接在一起。因此获取“蛇”的查询。

标签: javascript mysql sequelize.js


【解决方案1】:

好的,这是一个示例,假设 PatientEvents 的 PK 是所有历史记录行上的 original_key:

PatientEvents.hasMany(HistorySnake, {foreignKey : 'original_key'});

PatientEvents.findAll({
   include: [{
       model: HistorySnake,
       required : true,      // true = INNER JOIN but you might need outer join to see events with no history
       where : { modelName : 'PatientEvents' }  // as needed
       }],
   where: { patient_name : 'xyz' }  // as needed
   })        

【讨论】:

    【解决方案2】:

    我想通了。我不确定@KenOn10 的回答是否有效。对于这个问题,我太菜鸟了,但无论如何感谢您的回答。

    我最终像这样指定了我自己的“on”子句。

    models.Aim.find({
        include: [{
            model: models.ObjectiveReport,
            required: false,
            where: ['ObjectiveReports.report_entrydate >= ?', show_date],
                on: {
                    aim_id: sequelize.literal('aim.aim_id IN(SELECT current_key FROM historysnake WHERE original_key IN(SELECT original_key FROM historysnake WHERE current_key = aim.aim_id) AND historysnake.model = "aim")')
                })
    ...
    

    【讨论】:

      猜你喜欢
      • 2022-10-06
      • 2015-05-16
      • 1970-01-01
      • 1970-01-01
      • 2022-08-02
      • 1970-01-01
      • 1970-01-01
      • 2011-01-29
      • 1970-01-01
      相关资源
      最近更新 更多