Mysql 仅筛选每个主外键关系上的联接

Mysql 仅筛选每个主外键关系上的联接,mysql,sql,database,inner-join,greatest-n-per-group,Mysql,Sql,Database,Inner Join,Greatest N Per Group,我正在使用MySql 我有一个具有主键job_pk_id的表job,该表存储每个job的详细信息。此外,我还有一个表job_running_status,其中job表的job_pk_id是一个外键,该表基本上包含每个job_pk_id运行作业的时间记录。同一个job_pk_id将有多个条目,因为同一个job多次运行。job_running_status表还具有一个字段job_start_time,该字段给出了作业运行的每个实例的开始时间 现在,我的要求是获取每个作业的最新作业运行状态。最新的作业

我正在使用MySql

我有一个具有主键job_pk_id的表job,该表存储每个job的详细信息。此外,我还有一个表job_running_status,其中job表的job_pk_id是一个外键,该表基本上包含每个job_pk_id运行作业的时间记录。同一个job_pk_id将有多个条目,因为同一个job多次运行。job_running_status表还具有一个字段job_start_time,该字段给出了作业运行的每个实例的开始时间

现在,我的要求是获取每个作业的最新作业运行状态。最新的作业运行状态将根据作业运行状态中特定作业的最新作业开始时间选择

我知道这可以通过在job表和job\u running\u status表之间使用内部联接和ORDER BY job\u start\u time desc来实现,但我的挑战是,此ORDER BY将适用于联接中的所有作业,但我需要仅适用于与特定作业相对应的记录

编辑 我理解仅仅通过阅读理解我可能会令人困惑,因此我提供了一些示例:

作业表:

作业运行状态表:

我加入两个表格后的最终要求

注意:当加入I时,a应该只得到与每个作业表记录对应的1条记录。此记录是根据该作业的最新作业开始时间选择的。

您可以尝试此查询。与子查询交叉连接,以获取MAXjob\u运行状态

然后连接作业和运行作业状态表的作业

TestDLL

质疑

[结果]:


where子句中相关子查询的示例

drop table if exists t,t1;
create table t(id int);
create table t1(jid int,dt date);
insert into t values
(1),(2),(3);

insert into t1 values
(1,'2018-01-01'),
(1,'2018-02-01'),
(2,'2018-01-01'),
(3,'2018-01-01'),
(3,'2018-02-01'),
(3,'2018-03-01');

select t.id,t1.dt
from t
join t1 on t1.jid = t.id
where t1.dt =(select max(dt) from t1 where t1.jid = t.id);

+------+------------+
| id   | dt         |
+------+------------+
|    1 | 2018-02-01 |
|    2 | 2018-01-01 |
|    3 | 2018-03-01 |
+------+------------+
3 rows in set (0.00 sec)
如果您需要最新的n条记录,并且您不在8.0或更高版本上,则可以使用行数模拟

select t.id,s.dt
from t
join 
(select t1.jid,t1.dt ,
          if(t1.jid<>@p,@rn:=1,@rn:=@rn+1) rn,
          @p:=t1.jid p
from t1 
cross join (select @rn:=0,@p:=0) r
order by t1.jid ,t1.dt desc
) s on s.jid = t.id
where s.rn <= 2;

+------+------------+
| id   | dt         |
+------+------------+
|    1 | 2018-01-01 |
|    1 | 2018-02-01 |
|    2 | 2018-01-01 |
|    3 | 2018-02-01 |
|    3 | 2018-03-01 |
+------+------------+

显示一些示例数据会很好^^“最新的作业运行状态将根据作业运行状态中的特定作业唯一值的最新作业开始时间进行选择。“您似乎只为每个作业选择了一条记录,那么为什么您需要非作业的订单?”但我需要仅适用于以下记录:与特定作业相对应。“-因此,如果您有jobname/idSearch相关子查询,只需放置一个筛选器。顺便说一句,示例数据和预期输出更好地作为文本,我们可以使用,而不是图像,我们不能使用。@TimBiegeleisen编辑了我的原始帖子以给出示例。明白了,这个查询提供了最新的记录I.e 1记录。是否有任何方法可以使用相同的条件获取多个记录?我想获取一个作业记录的最新2个作业运行实例?是否像这样使用MAX?选择j.job\u pk\u id、jrs.fk\u job\u id、MAXt.job\u running\u status job\u running\u status job\u status job\u status jrs on j.job\u pk\u id=jrs.fk\u job\u id GROUP BY j.job\u pk\u id、jrs.fk\u job\u id我可以进行一些更正吗:在您编写job\u running\u\u状态之前,它是一个表名。这是故意的还是仅仅是一个输入错误?明白了,这很有帮助。这个查询提供了最新的记录I.e 1记录。是否有任何方法可以使用相同的条件获取多个记录,即我想要为一个作业记录获取最新的2个作业运行实例?这是范围爬行。你的问题应该是我怎样才能得到最新的n记录。不,你不能用这种方法。我会很快添加代码。哦,对不起,伙计…当然要添加代码…我会编辑原始海报上的标题为什么?我在2天前添加的编辑从“如果你需要最新的n条记录…”开始,涵盖了你的要求。
| job_pk_id | fk_job_id | job_running_status |
|-----------|-----------|--------------------|
|         1 |         1 |         2018-02-01 |
|         2 |         2 |         2018-02-01 |
drop table if exists t,t1;
create table t(id int);
create table t1(jid int,dt date);
insert into t values
(1),(2),(3);

insert into t1 values
(1,'2018-01-01'),
(1,'2018-02-01'),
(2,'2018-01-01'),
(3,'2018-01-01'),
(3,'2018-02-01'),
(3,'2018-03-01');

select t.id,t1.dt
from t
join t1 on t1.jid = t.id
where t1.dt =(select max(dt) from t1 where t1.jid = t.id);

+------+------------+
| id   | dt         |
+------+------------+
|    1 | 2018-02-01 |
|    2 | 2018-01-01 |
|    3 | 2018-03-01 |
+------+------------+
3 rows in set (0.00 sec)
select t.id,s.dt
from t
join 
(select t1.jid,t1.dt ,
          if(t1.jid<>@p,@rn:=1,@rn:=@rn+1) rn,
          @p:=t1.jid p
from t1 
cross join (select @rn:=0,@p:=0) r
order by t1.jid ,t1.dt desc
) s on s.jid = t.id
where s.rn <= 2;

+------+------------+
| id   | dt         |
+------+------------+
|    1 | 2018-01-01 |
|    1 | 2018-02-01 |
|    2 | 2018-01-01 |
|    3 | 2018-02-01 |
|    3 | 2018-03-01 |
+------+------------+