帮我编写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()) ;
但它没有返回所需的列表
答案 0 :(得分:1)
将LEFT JOIN
与IS 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()
)
答案 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。您的简单查询也帮助我添加了另一个条件来获得所需的答案。