MySQL LEFT JOIN使用条件运算符(> =和<)不返回连接表的空值

时间:2017-09-10 23:38:45

标签: mysql sql join

我有一个简单的酒店预订表(booking)。我正在使用MySQL。

booking_date    last_name   room_no     nights
2016-11-19      McDonnell   207         4
2016-11-20      Jenkins     203         5
2016-11-22      Ross        209         3
2016-11-23      Whitford    207         2
2016-11-27      Berry       207         2   

对于2016-11-212016-11-27期间的每一天,我想知道谁占用了207室,不包括那天检查过的人。例如,我们可以看到Whitford在2016-11-25签出,所以他不应该被列为占用者。如果给定日期没有占用者,我希望查询在该日期返回NULL

我创建了一个简单的日历(hotel_calendar):

StayDate    
2016-11-21  
2016-11-22  
2016-11-23  
2016-11-24  
2016-11-25  
2016-11-26  
2016-11-27

我试图通过匹配来找到日历上每一天的占用者:

SELECT        StayDate AS 'Date',
              last_name AS 'Last Name'

FROM          hotel_calendar

LEFT JOIN     booking ON
              (StayDate >= booking_date AND   
              StayDate < booking_date + INTERVAL nights DAY)

WHERE         room_no = 207 AND 
              StayDate BETWEEN '2016-11-21' AND '2016-11-27';

我的结果:

Date        Last Name
2016-11-21  McDonnell
2016-11-22  McDonnell
2016-11-23  Whitford
2016-11-24  Whitford
2016-11-27  Berry

2016-11-252016-11-26的房间无人居住。即使我使用了LEFT JOIN,查询也没有返回这些日期的NULL值。这是由于条件运算符的使用不正确吗?

1 个答案:

答案 0 :(得分:1)

首先,您应该对所有列名称进行限定,因此很清楚它们来自哪里。其次,永远不要在列别名周围使用单引号 - 只会导致问题。

但真正的问题是,# old way df1 = df.some_method1() .some_method2() df1.columns = columns df1.some_method3() second 表的条件需要进入LEFT JOIN子句,而不是ON子句。否则,WHERE会变为JOIN

INNER JOIN