Mysql Query查找免费员工

时间:2014-12-10 11:03:37

标签: mysql

帮我编写mysql查询,仅列出免费的员工(当前没有分配任务的员工)

任务表样本数据

   emp_id   task_start_date      task_compeletion_date  task_name
     872    2014-06-03 17:14:44  2014-06-04 17:14:46    task1
     873    2014-07-12 19:02:00  2014-07-13 00:25:00    task2
     872    2014-12-03 13:09:08  2014-12-30 12:54:15    task7
     874    2014-12-10 07:29:53  NULL                   task3

emp表样本数据

   emp_id   first_name          last_name   
     872    John            David
     873    Suresh          Kumar
     874    Peter           Nail
     875    Zio             Xing        

我创建了这个查询

select * from emp where emp_id not in ( select emp_id from task) union   select emp.* from emp emp, task task where emp.emp_id = task.emp_id and (task.task_compeletion_date is not null or task.task_compeletion_date<now())  ;

但它没有返回所需的列表

3 个答案:

答案 0 :(得分:1)

LEFT JOINIS NULL条件一起使用:

SELECT emp.* 
FROM emp LEFT JOIN
task on emp.emp_id=task.emp_id
WHERE task.task_start_date IS NULL

<强>解释

此查询将获取其id不在任务表中的所有员工。

<强>结果:

EMP_ID  FIRST_NAME  LAST_NAME
875     Zio         Xing

请参阅SQL Fiddle中的结果。

修改

对于免费的员工:

SELECT emp.* 
FROM emp LEFT JOIN
task on emp.emp_id=task.emp_id
WHERE task.task_start_date IS NULL
      OR (task.task_compeletion_date IS NOT NULL
          AND task.emp_id NOT IN (SELECT emp_id from task where task_compeletion_date>CURDATE()))
GROUP BY emp.emp_id,emp.first_name,emp.last_name

请参阅Demo

答案 1 :(得分:1)

euh我不确定,但我认为这样做:

SELECT * from emp WHERE emp_id NOT IN 
(
  SELECT emp_id FROM task 
  WHERE task_compeletion_date>NOW()
)

fiddle

答案 2 :(得分:0)

基于@CodeBird查询(withoug using union),查询可以简化如下

select * from emp where emp_id not in (select emp_id from tasksample where task_compeletion_date>now() or task_compeletion_date is NULL );

谢谢CodeBird。您的简单查询也帮助我添加了另一个条件来获得所需的答案。