2014-09-25 60 views
0

好吧,複雜的MySQL查詢 - 我是否使用正確的加入?

我有一個人與人(id,名稱,地址等)表。其中有一個與表員工(id,person_id,工資,department_id等)的一對多關係。而員工都屬於(多對一關係)不同的部門(ID,標題,位置,year_id),這些部門是特定年份的。

我想編寫查詢來查找2013年的員工,排除那些在2014年繼續爲公司工作的員工。基本上我希望那些去年爲公司工作但現在不再工作的人。我在下面做了一個微弱的嘗試。

SELECT * FROM people 
JOIN employees ON people.id=employees.person_id 
RIGHT JOIN departments ON employees.department_id=departments.id 
AND departments.year_id='2013' 
WHERE departments.year_id<>'2014' 

任何幫助,將不勝感激。

回答

0

可以使用not exists支票誰在2014年

SELECT * FROM people 
JOIN employees e ON people.id=e.person_id 
RIGHT JOIN departments ON e.department_id=departments.id 
WHERE departments.year_id='2013' 
AND NOT EXISTS 
(SELECT 1 
FROM departments 
JOIN employees ee ON ee.department_id=departments.id 
WHERE departments.year_id = '2014' 
AND e.id=ee.id 
) 

或者not in()解決方案停止工作,但它不建議這些員工由於相關子查詢

SELECT * FROM people 
JOIN employees e ON people.id=e.person_id 
RIGHT JOIN departments ON e.department_id=departments.id 
WHERE departments.year_id='2013' 
AND e.id NOT IN 
(SELECT ee.id 
FROM departments 
JOIN employees ee ON ee.department_id=departments.id 
WHERE departments.year_id = '2014' 
) 
0

我不能確定爲爲什麼你對員工有一對多的關係,或者你的系統中應用了這個功能,但是如果我理解正確的話,這應該起作用。

M Khalid Junaid的答案很可能會奏效,但是我鄙視使用子查詢,因爲他們往往不能很好地擴展。下面應該工作,每個員工只返回1行(沒有組),另外它只有1個左連接和沒有子查詢。

SELECT * FROM people 
JOIN employees ON people.id=employees.person_id 
JOIN departments as dept_start ON employees.department_id=departments.id && departments.year_id = 2013 
LEFT JOIN departments as dept_end ON employees.department_id=departments.id && departments.year_id = 2014 
WHERE dept_start.id IS NOT NULL && dept_end.id IS NULL