เทคนิคการ Query หาห้องพักว่าง
จากตารางด้านล่าง เป็นตารางของห้องพักหมายเลข 1 ซึ่งถูกจองแล้วระหว่างวันที่ 5 - 7
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
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))
ซึ่งผลลัพท์ที่ได้ก็จะเป็นรายการห้องอื่นๆที่ไม่ได้ถูกจองแล้วตามด้านบน