2014-01-22 54 views
-1

我试着拿两张表,检查是否有人被安排在一周中的某一天工作,如果有的话,将它们从结果。我只想结束那些没有预定的那些,比方说周六。他们可能安排在schedule_recurring一周中的其他日子,但我不在乎。我只是在乎他们是否在我看的那一天。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 

感谢您的帮助!

+0

什么你期待?如果我没有错,你期待员工在特定的日期。 –

+0

使用Join会给出预期的结果,但是您使用的是Cartesian类型的查询。 –

回答

1

使用左连接,而不是多FROM,和过滤非空值出:

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 
+0

你先生是friggin的向导。这似乎正是我所期待的。任何SQL书籍/教程你会推荐?谢谢! – user3084846

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但你仍然从两个表中选择?

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())) 
相关问题