【问题标题】:How to get the intersection of 2 mysql queries?如何获得2个mysql查询的交集?
【发布时间】:2017-09-04 03:23:29
【问题描述】:

假设我有一个如下所示的 MySQL 表:

表中的每个作业包含 3 个任务。

如何获取所有taskA 处于Done 状态且taskB 处于New 状态的JobIds?

就我而言,我想要一个返回 qwertzxcv 的查询。

我想出了这个查询:

select JobId from MyTable where TaskSeq=0 and TaskState='Done'
intersect
select JobId from MyTable where TaskSeq=1 and TaskState='New';

但我的 MySQL 版本不支持 intercept 运算符。

我的最终目标是在sequelize 中编写查询。但我想我应该先知道 MySQL 查询,这样我才能创建一个 sequlize 查询。

我也希望 sequlize 查询可以在 1 个函数中完成,而不是与 then 连接的多个函数。

这里是SQL Fiddle,可帮助您试一试。

【问题讨论】:

  • 你能做一个union all吗?

标签: javascript mysql sequelize.js


【解决方案1】:

你可以只使用一个连接:

select mt.JobId 
from   MyTable mt
         join MyTable mt2 on mt2.JobId = mt.JobId
where  mt.TaskSeq = 0 and mt.TaskState = 'Done' and mt2.TaskSeq = 1 and mt2.TaskState = 'New'

这是对这个查询的 Sequelize 尝试,但这是一个猜测。希望它能给你一些工作:

MyTable.findAll({
    attributes: ['JobId', 'TaskSeq', 'TaskState'],
    include: [{
        model: MyTable,
        attributes: ['JobId', 'TaskSeq', 'TaskState'],
        where: { 
            JobId: Sequelize.col('MyTable.JobId'),
            TaskSeq: 1,
            TaskState: 'New'
        }
    }],
    where {
        TaskSeq: 0,
        TaskState: 'Done'
    }
});

【讨论】:

  • 谢谢。这行得通。但我需要把它写在sequelize中。你知道如何实现吗?
  • 我已经更新了这个问题,并猜测了续集。
猜你喜欢
  • 1970-01-01
  • 2013-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-06
  • 1970-01-01
  • 2015-01-25
  • 1970-01-01
相关资源
最近更新 更多