เทคนิคการ Query หาห้องพักว่าง

วิธีการตรวจสอบห้องว่างหรือไม่ในวันที่กำหนดจริงๆก็ไม่ได้ยากเย็นอะไรครับ แค่เข้าใจเงื่อนไขของมัน และออกแบบฐานข้อมูลให้เหมาะสมเท่านั้น ผมยกตัวอย่างการ Query แบบง่ายๆดังนี้ครับ

จากตารางด้านล่าง เป็นตารางของห้องพักหมายเลข 1 ซึ่งถูกจองแล้วระหว่างวันที่ 5 - 7
1 2 3 4 5 6 7 8 9 10
สมมุติเราต้องการจองห้องนี้ในวันที่ 4 - 8 และเราต้องการตรวจสอบว่า ห้องนี้ว่างในระหว่างวันที่ 4 - 8 หรือไม่ ทำได้ดังนี้
SELECT room_id FROM hotel_booking WHERE (DAY(checkIn) BETWEEN $start AND $end) OR (DAY(checkOut) BETWEEN $start AND $end)

ลองแทนค่าดูจะได้ว่า
SELECT room_id FROM dusit_hotel_booking WHERE (DAY(checkIn) BETWEEN 4 AND 7) OR (DAY(checkOut) BETWEEN 4 AND 7)

ซึ่งถ้าพิจารณาเพียงเงื่อนไขเดียว คือ checkIn BETWEEN 4 AND 7 ก็จะให้ผลลัพท์เป้นจริงแล้ว นั่นหมายความว่า ห้องนี้ไม่ว่างในวันที่ 4 - 8
แต่หากต้องการจอง ตั้งแต่วันที่ 5 ขึ้นไป เงื่อนไขแรกจะไม่เป้นจริง แต่จะเป็นจริงในเงื่อนไขที่ 2 แทน เช่น
SELECT room_id FROM dusit_hotel_booking WHERE (DAY(checkIn) BETWEEN 6 AND 10) OR (DAY(checkOut) BETWEEN 6 AND 10)

ในกรณีนี้ DAY(checkOut) BETWEEN 6 AND 10 จะเป็นจริงแทน

ส่วนการหาว่า ห้องใดว่างบ้างก็จะได้คำสั่งว่า เป็นห้องที่ไม่ได้ถูกจองแล้วตามด้านบน
SELECT * FROM hotel_room WHERE id NOT IN (SELECT room_id FROM hotel_booking WHERE (DAY(checkIn) BETWEEN $start AND $end) OR (DAY(checkOut) BETWEEN $start AND $end))

ลองแทนค่าดูจะได้ว่า
SELECT * FROM hotel_room WHERE id NOT IN(SELECT room_id FROM hotel_booking WHERE (DAY(checkIn) BETWEEN 4 AND 7) OR (DAY(checkOut) BETWEEN 4 AND 7)) 

ซึ่งผลลัพท์ที่ได้ก็จะเป็นรายการห้องอื่นๆที่ไม่ได้ถูกจองแล้วตามด้านบน

ผู้เขียน goragod โพสต์เมื่อ 26 เม.ย. 2555 เปิดดู 13,126 ป้ายกำกับ PHPMySQLSQL
^