ตัวอย่างฐานข้อมูล
SQL สำหรับสร้างตารางอยู่ท้ายบทความ |
ข้อมูลการจอง ช่วงวันที่ 2018-07-18 - 2018-07-22
สรุปห้องที่ถูกจองแล้ว
ห้อง ช่วงวันที่จอง
5 19/7/2018 - 21/7/2018
6 20/7/2018 - 21/7/2018
1 19/7/2018 - 20/7/2018
9 18/7/2018 - 23/7/2018
ดังนั้น หากต้องการเข้าพักในช่วงวันที่ 2018-07-18 - 2018-07-22 จะเหลือห้องว่างดังนี้
ห้อง 2 , 3, 4, 7, 8, 10
ขั้นตอนการค้นหาห้องว่าง มีดังต่อไปนี้
1. ค้นหารายการห้องที่ถูกจองในช่วงเวลาที่ต้องการเข้าพัก
SELECT
tb_booking.id,
tb_booking.booking_name,
tb_booking_detail.room_num,
tb_booking_detail.date_start,
tb_booking_detail.date_end
FROM
tb_booking
INNER JOIN
tb_booking_detail on tb_booking.id = tb_booking_detail.ref_booking_id
WHERE
(date_start BETWEEN '2018-07-18' AND '2018-07-22')
OR
(date_end BETWEEN '2018-07-18' AND '2018-07-22')
OR
('2018-07-18' BETWEEN date_start AND date_end)
OR
('2018-07-22' BETWEEN date_start AND date_end )
จะได้รายการที่ถูกจองแล้วดังนี้
2. หลังจากตรวจสอบแล้วได้ข้อมูลถูกต้องครบถ้วน ก็สร้าง SQL ขึ้นมาอีกชั้น ครอบคำสั่งค้นหาห้องที่จองแล้ว โดยกำหนดเงื่อนไขคือ ต้องการเฉพาะ "รายการที่ไม่อยู่ในรายการจอง"
SELECT *
FROM tb_room
WHERE room_number NOT IN(................คำสั่ง SQL ที่ค้นหารายการจอง.................)
โดยจะเขียน SQL เพื่อหาห้องว่างแบบเต็มๆ ได้ดังนี้
SELECT *
FROM tb_room
WHERE room_number NOT IN
(
SELECT
tb_booking_detail.room_num
FROM
tb_booking
INNER JOIN
tb_booking_detail on tb_booking.id = tb_booking_detail.ref_booking_id
WHERE
(date_start BETWEEN '2018-07-18' AND '2018-07-22')
OR
(date_end BETWEEN '2018-07-18' AND '2018-07-22')
OR
('2018-07-18' BETWEEN date_start AND date_end)
OR
('2018-07-22' BETWEEN date_start AND date_end )
)
ก็จะได้ผลลัพธ์เฉพาะรายชื่อห้องที่ไม่อยู่ในรายการจอง นั่นก็คือห้องที่ไม่ได้ถูกระบายสีเหลืองเอาไว้นั่นเอง ห้อง 2 , 3, 4, 7, 8, 10
เพียงเท่านี้ เราก็ได้โค้ด SQL สำหรับเช็คห้องว่าง เพื่อนำไปใช้กับโปรเจ็กต์ PHP จองห้องพักได้เป็นที่เรียบร้อย
ไว้บทความต่อไป จะมาอธิบายทีละส่วนเกี่ยวกับการ WHERE โดยใช้ OR ถึง 4 ครั้งด้วยกัน ???? แบบระเอียดอีกครั้ง พร้อมกับโค้ด PHP สำหรับตรวจสอบการทำงานกันนะครับ
(date_start BETWEEN '2018-07-18' AND '2018-07-22')
OR
(date_end BETWEEN '2018-07-18' AND '2018-07-22')
OR
('2018-07-18' BETWEEN date_start AND date_end)
OR
('2018-07-22' BETWEEN date_start AND date_end )
ปล. จากคอมเมนต์ของคุณ @Komkit จากบทความก่อนหน้านี้ทดสอบแล้วทำงานได้เช่นกันครับ เพียงแค่เปลี่ยนจาก OR เป็น AND ซึ่งช่วยให้การทำงานน่าจะเร็วขึ้นครับ
SELECT * FROM ReserveRoom
WHERE (RoomID =@RoomID)
AND (BeginDate <=@EndDate)
AND (EndDate >=@BeginDate)
อ่านบทความ SQL สำหรับระบบจองห้องประชุม ได้ที่
SQL สำหรับตรวจสอบช่วงเวลาที่ว่าง สำหรับระบบจองห้อง ต่างๆ
http://sunzandesign.blogspot.com/2013/05/php-mysql-booking-room.html
SQL สำหรับสร้างตาราง
-- Dumping structure for table test.tb_booking
CREATE TABLE IF NOT EXISTS `tb_booking` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`booking_name` varchar(50) NOT NULL DEFAULT '0',
`booking_amount` int(5) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
-- Dumping data for table test.tb_booking: ~3 rows (approximately)
/*!40000 ALTER TABLE `tb_booking` DISABLE KEYS */;
INSERT INTO `tb_booking` (`id`, `booking_name`, `booking_amount`) VALUES
(1, 'คุณสมหมาย สายเสมอ', 7),
(2, 'คุณมีสุข สมหวัง', 2),
(3, 'คุณจริงใจ แสนดี', 4);
/*!40000 ALTER TABLE `tb_booking` ENABLE KEYS */;
-- Dumping structure for table test.tb_booking_detail
CREATE TABLE IF NOT EXISTS `tb_booking_detail` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`ref_booking_id` int(11) NOT NULL,
`date_start` date NOT NULL,
`date_end` date NOT NULL,
`room_num` int(2) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;
-- Dumping data for table test.tb_booking_detail: ~4 rows (approximately)
/*!40000 ALTER TABLE `tb_booking_detail` DISABLE KEYS */;
INSERT INTO `tb_booking_detail` (`id`, `ref_booking_id`, `date_start`, `date_end`, `room_num`) VALUES
(1, 1, '2018-07-19', '2018-07-21', 5),
(2, 1, '2018-07-20', '2018-07-21', 6),
(3, 2, '2018-07-19', '2018-07-20', 1),
(4, 3, '2018-07-18', '2018-07-23', 9);
/*!40000 ALTER TABLE `tb_booking_detail` ENABLE KEYS */;
-- Dumping structure for table test.tb_room
CREATE TABLE IF NOT EXISTS `tb_room` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`room_name` varchar(50) DEFAULT NULL,
`room_number` int(11) DEFAULT NULL,
`max_amount` int(3) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;
-- Dumping data for table test.tb_room: ~10 rows (approximately)
/*!40000 ALTER TABLE `tb_room` DISABLE KEYS */;
INSERT INTO `tb_room` (`id`, `room_name`, `room_number`, `max_amount`) VALUES
(1, 'ห้อง AAAA', 1, 3),
(2, 'ห้อง BBB', 2, 3),
(3, 'ห้อง CCC', 3, 3),
(4, 'ห้อง DDD', 4, 3),
(5, 'ห้อง EEE', 5, 3),
(6, 'ห้อง FFF', 6, 5),
(7, 'ห้อง GGG', 7, 5),
(8, 'ห้อง HHH', 8, 5),
(9, 'ห้อง III', 9, 5),
(10, 'ห้อง JJJ', 10, 5);
ความคิดเห็น
แสดงความคิดเห็น