โจทย์เขาต้องการหาห้องว่างในช่วงเวลาดังกล่าว มันไม่มีตัวบ่งชี้ว่าอะไรที่บอกว่าห้องนั้นว่าง นอกจากเวลา check out ครับ
(ถ้า checkin วันที่ 1 แล้ว checkout วันที่ 5 ก็ไม่อยู่ในเงื่อนไขครับ แสดงว่าห้องนั้นไม่ว่าง
ถ้ามี checkin แต่ checkout เป็น null ก็แสดงว่าห้องนั้นจองอยู่ หรือเป็น null ทั้งคู่ห้องนั้นก็คือห้องว่าง แต่มันอยู่ช่วงเวลาไหน)
เงื่อนไขที่เราสนใจคือ checkout ที่อยู่ระหว่างวันที่ 2-4 ให้แสดง room นั้นออกมา(อาจจะมี room ที่ยังไม่ว่างเสียทีเดียว เนื่องจากช่วงเวลาทาบเกี่ยวกันอยู่)
มันอาจจะไม่ตรงกับความต้องการเท่าไร แต่ถ้าโครงสร้างของ table มีฟิลด์ประมาณนี้คงต้องใช้วิธีนี้ละครับ

มันจะไม่มีประโยชน์เลยสำหรับข้อมูลชุดอื่นครับ... เวลาเราเขียน SQL Command ต้องพึงนึกถึงคำว่า Robust ไว้จนชินครับ เพราะหากมัน Robust แล้ว มัน Reusable ด้วย
ใช้ได้กับทุก Possibility ของข้อมูล
ถ้าหากคุณคิดว่า Constraint ของคุณกำหนดด้วย PHP ได้ไม่ขาดตกบกพร่อง ไม่ได้ปล่อยค่าว่างเข้ามา Search ใช้ของคุณ MapTwoZa ด้านบนครับ
ถ้าหากคุณคิดจะป้องกันตั้งแต่ PHP มา Database ก็เสริมอีกชั้น ก็กำหนดให้ครอบคลุมอีกรอบดักจับหากค่าใดค่าหนึ่งว่าง ใช้ของผมข้างบนครับ
ผมไม่เชื่อว่านอกจากตาราง Booking/Reservation แล้ว จะไม่มีตาราง Room หากไม่มีจริงๆ ก็เพิ่มเถอะครับ หากไม่อยากปวดหัวในอนาคต
สุดท้าย ต้องบอกว่าการออกแบบระบบจอง ค่อนข้างง่าย เมื่อเที่ยบกับ Logic ในแขนงอื่นๆ ครับ เช่น SCM, CRM เป็นต้น ออกแบบมาดี ตอนเทสก็ไม่ลำบากมาก ทำไปเรื่อยๆ เดี๋ยวมันก็ชินเองครับ