我有一个简单的酒店预订表(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-21
到2016-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-25
和2016-11-26
的房间无人居住。即使我使用了LEFT JOIN
,查询也没有返回这些日期的NULL
值。这是由于条件运算符的使用不正确吗?
答案 0 :(得分:1)
首先,您应该对所有列名称进行限定,因此很清楚它们来自哪里。其次,永远不要在列别名周围使用单引号 - 只会导致问题。
但真正的问题是,# old way
df1 = df.some_method1()
.some_method2()
df1.columns = columns
df1.some_method3()
中 second 表的条件需要进入LEFT JOIN
子句,而不是ON
子句。否则,WHERE
会变为JOIN
:
INNER JOIN