我们有两个表,person
和 dates
,前者存储有关人员的信息,后者存储与人员相关的日期。
在person表中我们这里关心的信息是
psref clock prev
1 80
2 90
3 100 80
4 101 90
psref
是表中的唯一引用。 clock
是当前的工资单编号。 prev
表示此人以前受雇于不同的工资单编号。
日期表存储与每个人相关的日期。
dtref person date event
1 1 2010-01-01 1 (start)
2 1 2010-02-01 2 (leaving)
3 2 2010-01-01 1
4 2 2010-02-01 2
5 3 2010-02-02 1
6 4 2011-01-01 1
从上面的数据可以看出,回国的人有2种情况。
场景 A 人 1 于 2010 年 2 月 1 日离开公司,并在第二天获得一份新契约(Contract),并使用新的时钟编号。
场景 B 人 2 于 2010-02-01 离开公司,一年后返回,2011-01-01
我可以通过以下查询将每个 psref 的开始和结束日期作为一行获取:
SELECT clock, prev, a.date AS StartDate, b.date AS LeavingDate
FROM person
LEFT OUTER JOIN dates a ON (psref = a.person AND a.event = 1)
LEFT OUTER JOIN dates b ON (psref = b.person AND b.event = 2)
我需要做的只是为一个人报告一行,他们的 prev
离开日期是他们当前开始日期前 1 天。
链不一定只有一层深(别问!)
最佳答案
这应该为您提供当前作业在上一个作业一天后开始的所有条目(假设 clock
和 prev
是唯一值):
SELECT *
FROM person tp
JOIN dates tdt
ON (tp.psref = tdt.person AND tdt.event = 1)
join person lp
on tp.clock = lp.clock
JOIN dates ldt
ON (lp.psref = ldt.person AND ldt.event = 2)
and DATEDIFF(tdt.date, ldt.date) = 1;
如果“当前”是指当前工作没有结束日期,您也可以检查一下:
SELECT *
FROM person tp
JOIN dates tdt
ON (tp.psref = tdt.person AND tdt.event = 1)
join person lp
on tp.clock = lp.clock
JOIN dates ldt
ON (lp.psref = ldt.person AND ldt.event = 2)
and datediff(tdt.date, ldt.date) = 1
left join dates tdtend ON (tp.psref = tdt.person AND tdt.event = 2)
where tdtend.date is null;
关于mysql - 在 MySQL 中链接事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37722640/