在MySQL中链接事件

时间:2016-06-09 09:55:40

标签: mysql

我们有两个表person,用于存储有关某个人的信息,dates用于存储与某个人相关的日期。

在人员表中,我们关注的信息是

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

根据以上数据,您可以看到返回的人有两种情况。

情景A 1号人员在2010-02-01离开了公司,并在第二天给出了一份新的合同,新的时钟号。

情景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天的人。

链条不一定只有1层深(不要问!)

1 个答案:

答案 0 :(得分:1)

这应该为您提供当前作业在上一个作业后一天开始的所有条目(假设clockprev是唯一值):

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;