gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 23:10:29 26 4
gpt4 key购买 nike

我有一个简单的酒店预订表 (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 房间,不包括 checkout 该房间的任何人天。例如,我们可以看到 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 值。这是由于错误地使用了条件运算符吗?

最佳答案

首先,您应该限定所有列名,以便清楚它们的来源。其次,永远不要在列别名周围使用单引号——这只会导致问题。

但是,您真正的问题是LEFT JOINsecond 表的条件需要进入ON 子句,而不是WHERE 子句。否则,JOIN 会变成 INNER JOIN:

SELECT c.StayDate AS Date, b.last_name
FROM hotel_calendar c LEFT JOIN
booking b
ON c.StayDate >= b.booking_date AND
c.StayDate < b.booking_date + INTERVAL nights DAY AND
b.room_no = 207
WHERE c.StayDate BETWEEN '2016-11-21' AND '2016-11-27';

关于MySQL LEFT JOIN 使用条件运算符(>= 和 <)不返回连接表的空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46146522/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com