2016-06-09 59 views
1

我們有兩個表格person,其中存儲有關人員的信息,而dates存儲與人員關聯的日期。MySQL中的鏈接事件

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

我需要做的僅僅是報告一個人的ID他們prev離開日期前1天到他們當前開始日期一行。

鏈不一定只有1層深(不要問!)

回答

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

這是否ONL y遞歸到一個層次? –

+0

@丹凱利它會檢查鏈中的每一個條目。唯一的要求是,「以前僱用」意味着日期不重疊(所以一個人不能同時有兩個工作,因此每個工作至多有一個前任,否則它不會是一個鏈)。它不適合你嗎? – Solarflare

+0

可以工作 - 只有幾個問題用真實的數據解決上述抽象案例......只需要弄清楚如何將名稱表添加到組合中,但我理解這裏發生了什麼。 –