gpt4 book ai didi

mysql - 重叠预订查询

转载 作者:行者123 更新时间:2023-11-29 10:08:59 25 4
gpt4 key购买 nike

我的 sql 语句也有类似的问题,如下 Room Booking Query

如果公寓只有一次预订,则以下查询有效。但如果一套公寓有多个预订,该公寓也会出现在结果中,尽管它在请求的时间范围内不可用。

SELECT DISTINCT `apartment`.*
FROM `apartment` `apartment`
LEFT JOIN `booking` `booking` ON `apartment`.`uid` = `booking`.`apartment`
WHERE (
NOT(
( `booking`.`start` <= '2018-07-23')
AND
( `booking`.`end` >= '2018-07-21')
)
)

有人可以帮我写正确的sql吗?

更新:根据 Matt Raines 的提示,我在预订表中添加了一套野外公寓以及公寓的 uid。我非常感谢任何帮助我编写正确 SQL 语句的建议!

这里是更新演示数据:

--
-- Table structure for table `apartment`
--
CREATE TABLE `apartment` (
`uid` int(11) NOT NULL,
`title` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
`bookings` int(10) UNSIGNED NOT NULL DEFAULT '0'
)
--
-- Data for table `tx_apartments_domain_model_apartment`
--
INSERT INTO `apartment` (`uid`, `title`, `bookings`) VALUES
(1, 'Apartment 1', 2),
(2, 'Apartment 2', 1),
(3, 'Apartment 3', 1),
(4, 'Apartment 4', 1);

--
-- Table structure for table `booking`
--
CREATE TABLE `booking` (
`uid` int(11) NOT NULL,
`start` date DEFAULT '0000-00-00',
`end` date DEFAULT '0000-00-00',
`apartment` int(10) UNSIGNED NOT NULL DEFAULT '0'
)
--
-- Data for table `booking`
--
INSERT INTO `booking` (`uid`, `start`, `end`, `apartment`) VALUES
(1, '2018-07-18', '2018-07-20', 1),
(2, '2018-07-21', '2018-07-23', 1),
(3, '2018-07-18', '2018-07-20', 2);

最佳答案

考虑以下因素。

DROP TABLE IF EXISTS apartment;

CREATE TABLE apartment
(apartment_id SERIAL PRIMARY KEY
,apartment_name varchar(255) NOT NULL
);

INSERT INTO apartment VALUES
(1, 'Apartment 1'),
(2, 'Apartment 2'),
(3, 'Apartment 3'),
(4, 'Apartment 4');

DROP TABLE IF EXISTS booking;

CREATE TABLE booking
(booking_id SERIAL PRIMARY KEY
,start_date DATE NOT NULL
,end_date DATE NOT NULL
,apartment_id INT NOT NULL
);

INSERT INTO booking VALUES
(1, '2018-07-18', '2018-07-20', 1),
(2, '2018-07-21', '2018-07-23', 1),
(3, '2018-07-18', '2018-07-20', 2);



SELECT a.*
FROM apartment a
LEFT
JOIN booking b
ON b.apartment_id = a.apartment_id
AND b.start_date <= '2018-07-23'
AND b.end_date > '2018-07-21'
WHERE b.booking_id IS NULL;
+--------------+----------------+
| apartment_id | apartment_name |
+--------------+----------------+
| 2 | Apartment 2 |
| 3 | Apartment 3 |
| 4 | Apartment 4 |
+--------------+----------------+

实际上,除非绑定(bind)在事务中,否则这样的 SELECT 是相当没有意义的,因为当您仍在检查可用性时,其他用户可以轻松地出现并进行预订。

关于mysql - 重叠预订查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51366904/

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