我的sql语句也有类似的问题,比如这里的房间预订查询。
如果一个公寓只有一个预订,下面的查询就可以使用。但是,如果一个公寓有多个预订,那么这个公寓也在结果中,尽管它在请求的时间范围内不可用。
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吗?
更新:根据马特·雷恩斯的提示,我在预订表中添加了一个带有公寓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);
1条答案
按热度按时间falq053o1#
考虑以下几点。
实际上,除非绑定在一个事务中,否则这样的选择是毫无意义的,因为在您检查可用性时,另一个用户可以很容易地进行预订。