MySQL - 获取两个表并返回一个不存在的结果

时间:2014-01-22 01:09:05

标签: mysql

我正在尝试拿两张桌子,检查某人是否安排在一周中的某一天工作,如果有,请将其从结果中删除。我想最终只得到那些没有安排的,比如星期六。他们可能会按计划安排一周中的其他几天,但我不在乎。我只关心他们是否在我正在看的特定日子。

我有两张桌子。为简单起见,让我们说:

schedule_recurring:

ID, Date_Start, Employee_ID, Date_End

员工:

ID, FirstName, LastName  

如何神圣地狱我会采取这种方式并创建一个SQL语句,它将为我提供在我正在查看的那天不可用的所有人,无论他们是否在一周的另一天工作。我一直在接待每一位员工,或者接近这一点。

我的目标是看一个人是否在一周中的某一天工作,如果他们这样做,我不在乎他们是否安排在一周中的另一天,我希望他们不在结果中。

下面的业余SQL语句:

SELECT 
    schedule_recurring.Date_Start, 
    employees.ID, 
    employees.FirstName, 
    employees.LastName
FROM schedule_recurring, employees
WHERE DAYNAME(Date_Start) != DAYNAME('2014-01-20') and 
      DATE(Date_End) > DATE(NOW()) AND 
      Employee_ID != employees.ID
GROUP BY employees.ID

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

使用LEFT JOIN而不是multi-FROM,并过滤掉非NULL:

SELECT 
    schedule_recurring.Date_Start, 
    employees.ID, 
    employees.FirstName, 
    employees.LastName
FROM employees
LEFT JOIN schedule_recurring ON schedule_recurring.Employee_ID = employees.ID
  AND DAYNAME(Date_Start) = DAYNAME('2014-01-20')
WHERE schedule_recurring.ID IS NULL

答案 1 :(得分:0)

使用LEFT JOIN,或阅读此JOIN语法:http://dev.mysql.com/doc/refman/5.0/en/join.html

SELECT sc.Date_Start, em.ID, em.FirstName, .em.LastName 
FROM schedule_recurring AS sc 
LEFT JOIN employees AS em ON(em.ID != sc.Employee_ID) 
WHERE DAYNAME(sc.Date_Start) != DAYNAME('2014-01-20') and DATE(sc.Date_End) > DATE(NOW()) 
GROUP BY em.ID

P / s:为什么Employee_ID != employees.ID,但您仍然从两个表中选择?

答案 2 :(得分:0)

试试这个: -

SELECT e.ID,e.FirstName,e.LastName,s.Date_Start
FROM schedule_recurring s 
LEFT JOIN employees e ON e.ID = s.Employee_ID 
WHERE DATE(s.Date_Start) != DATE('2014-01-20') and (DATE(s.Date_End) > DATE(NOW()))