2014-09-25 59 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