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

xeufq47z  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(322)

我正在使用mysql。
我有一张table job 有主键的 job_pk_id 表中存储了每个作业的详细信息。我还有一张table job_running_status 哪里 job table的 job_pk_id 是一个外键,此表基本上包含为每个外键运行作业的时间记录 job_pk_id 。同一项将有多个条目 job_pk_id 因为同一个作业运行多次。 job_running_status 表还有一个字段 job_start_time 它给出了作业运行的每个示例的开始时间。
现在我的要求是拿到最新的 job_running_statusjob . 最新的 job_running_status 将根据最新的 job_start_time (仅针对特定工作)价值 job_running_status .
我知道这可以通过 INNER JOIN 以及 ORDER BY job_start_time desc 介于 job 表和 job_running_status 但我的挑战是 ORDER BY 适用于 JOIN 但我需要只适用于与特定作业对应的记录。 EDIT I understand it might be confusing to understand me by just reading so I am providing some examples: job 表格:
job_running_status 表格:
My final requirement after joining both the tables
注意:当加入i a时,每个job表记录只对应一条记录。此记录是根据该作业的最新作业开始时间选择的。

ssgvzors

ssgvzors1#

您可以尝试此查询。 CROSS JOIN 使用子查询 MAX(job_running_status) 然后加入 job 以及 job_running_status table。
测试DLL

CREATE TABLE JOB(
   job_pk_id int
);

INSERT INTO JOB VALUES (1),(2),(3);

CREATE TABLE job_running_status(
   fk_job_id INT,
   job_running_status DATE
);

INSERT INTO  job_running_status VALUES (1,'2018-01-01');
INSERT INTO  job_running_status VALUES (1,'2018-02-01');
INSERT INTO  job_running_status VALUES (2,'2018-01-03');
INSERT INTO  job_running_status VALUES (2,'2018-01-02');

查询

SELECT DISTINCT 
    j.job_pk_id,
    jrs.fk_job_id,
    t.job_running_status
FROM 
(SELECT MAX(job_running_status) job_running_status FROM job_running_status) t
CROSS JOIN job j 
inner join job_running_status  jrs on j.job_pk_id = jrs.fk_job_id

[结果]:

| job_pk_id | fk_job_id | job_running_status |
|-----------|-----------|--------------------|
|         1 |         1 |         2018-02-01 |
|         2 |         2 |         2018-02-01 |

sqlfiddle公司

aiqt4smr

aiqt4smr2#

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 |
+------+------------+

相关问题