簡體   English   中英

Mysql查詢以獲取酒店房間可用性

[英]Mysql query to get hotel room availability

我正在實施一個預訂平台,我有 3 張桌子:

  • "hotel" - 保存酒店信息
  • "hotel_room" - 保存每家酒店的房間信息
  • "hotel_room_price" - 按日期、可用房間數量和價格提供可用性

我想按開始日期和結束日期、本地和房間數搜索(每個房間都有成人人數和兒童人數)

這是我的表的一些示例:

CREATE TABLE `hotel` (
  `id` int(11) NOT NULL,
  `name` varchar(255) NOT NULL,
  `rating` smallint(6) NOT NULL DEFAULT '3' COMMENT '0 - Not Rated | 1 - One Star | 2 - Two Stars | 3 - Three Stars | 4 - Four Stars | 5 - Five Stars',
  `local` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `hotel_room` (
  `id` int(11) NOT NULL,
  `hotel_id` int(11) NOT NULL,
  `name` varchar(255) NOT NULL,
  `max_capacity_adult` smallint(6) NOT NULL,
  `max_capacity_child` smallint(6) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `hotel_room` ADD CONSTRAINT `fk_hotel_room_hotel_id` FOREIGN KEY (`hotel_id`) REFERENCES `hotel` (`id`) ON DELETE CASCADE;

CREATE TABLE `hotel_room_price` (
  `id` int(11) NOT NULL,
  `hotel_room_id` int(11) NOT NULL,
  `price_adult` decimal(20,2) DEFAULT NULL,
  `price_child` decimal(20,2) DEFAULT NULL,
  `quantity` int(11) NOT NULL DEFAULT '1' COMMENT 'available rooms, 0 if there is no more available',
  `date` date NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `hotel_room_price` ADD CONSTRAINT `fk_hotel_room_price_hotel_room_id` FOREIGN KEY (`hotel_room_id`) REFERENCES `hotel_room` (`id`) ON DELETE CASCADE;

在用戶搜索時獲取可用房間的更好方法是什么,請注意可以搜索多個房間,例如:

start_date = 2019-06-25
end_date = 2019-06-29
local = "Tomar"
Room=[
  [
     nr_adults = 2,
     nr_children=1
  ],
  [
     nr_adults = 4,
     nr_children=0
  ]
]

我認為首先要做的是只檢查當地的酒店,然后檢查房間是否可以容納成人和兒童的人數,如果是的話,檢查是否有空房。 我在創建一個查詢或多個查詢以正確的方式處理這個問題時遇到了很多問題。

您可以在此處查看我的數據庫示例http://sqlfiddle.com/#!9/458be2c

這是選擇給定時間范圍內所有可用房間 ID 的查詢。 在本例中,我選擇了 6 月 26 日至 6 月 28 日。這應該是查詢其余部分的良好起點。

SELECT hotel_room_id
FROM hotel_room_price
WHERE date between '2019-06-26' AND '2019-06-28'
AND quantity > 0
GROUP BY hotel_room_id
HAVING COUNT(*) > DATEDIFF('2019-06-28', '2019-06-26')

這是一個有點棘手的查詢,用於獲取有關房間的一些信息。 請注意,此示例中沒有用於搜索多個房間的功能:

SELECT h.name AS Name, h.rating AS Rating, sq.name AS Type
FROM hotel h
INNER JOIN
(SELECT * 
FROM hotel_room
WHERE hotel_room.id IN
(SELECT hotel_room_id
FROM hotel_room_price
WHERE date between '[START DATE]' AND '[END DATE]'
AND quantity > 0
GROUP BY hotel_room_id
HAVING COUNT(*) > DATEDIFF('[END DATE]', '[START DATE]'))
AND max_capacity_child >= [CHILD COUNT]
AND max_capacity_adult >= [ADULT COUNT]) sq
ON h.id = sq.hotel_id
WHERE h.local = "[LOCATION]"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM