mysql - 在 MySQL 中链接事件

标签 mysql

我们有两个表,persondates,前者存储有关人员的信息,后者存储与人员相关的日期。

在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 天。

链不一定只有一层深(别问!)

最佳答案

这应该为您提供当前作业在上一个作业一天后开始的所有条目(假设 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;

关于mysql - 在 MySQL 中链接事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37722640/

相关文章:

mysql - 我可以在 MySQL 中显示消息吗?

php - 使用 fopen、mysql 查询、include/require 检索字符串值的速度如何

python - "Injecting"从外部数据库到 SQLAlchemy 对象的字典数据

mysql - 使用 LIKE 时如何处理空字段值

PHP MySql 电子商务左栏过滤结果

mysql 匹配文本中的特殊字符%

php - 如何识别多重查询 mysqli 和 php 中的特定 select 语句

sql - 有没有办法保证 MySQL 中的非阻塞读取?

mysql - 将 Amazon RDS 实例从 MySQL 5.5 升级到 MySQL 5.6

java - hibernate - 为mysql连接创建字符串类型的主键