आपकी समस्या यह है कि आपकी क्वेरी पर्याप्त रूप से मजबूत नहीं है। जब आप समस्या को तोड़ते हैं, तो आपके पास यह होता है:
अगर $check_in . द्वारा परिभाषित रेंज और $check_out checkin . द्वारा परिभाषित सीमा को ओवरलैप करता है और checkout किसी . में रास्ता, फिर कमरा बुक हो जाता है। अन्यथा, यह मुफ़्त है।
इसका मतलब है कि:
- यदि
$check_in>=checkinऔर$check_in<=checkout, कमरा बुक किया गया . है - या अगर
$check_out>=checkinऔर$check_out<=checkout, कमरा बुक किया गया . है - या अगर
$check_in<=checkinऔर$check_out>=checkout, कमरा बुक किया गया . है
इसलिए, आप जिस जानकारी की तलाश कर रहे हैं उसे प्राप्त करने के लिए आपको अपनी सबक्वायरी में इन दोनों परिदृश्यों का प्रतिनिधित्व करने की आवश्यकता है।
साथ ही, उम्मीद है कि आप datetime . का उपयोग कर रहे होंगे आपकी तुलना के लिए और न केवल time . के लिए , अन्यथा आपको दुष्प्रभाव होंगे।
संपादित करें:SQL क्वेरी
(ध्यान रखें कि बिल्ली की खाल निकालने के एक से अधिक तरीके हैं, इसलिए बोलने के लिए। मैं केवल एक उदाहरण प्रदान कर रहा हूं जो आपके पास पहले से जितना संभव हो सके रखता है। एक बार फिर, मैं यह भी मान रहा हूं कि checkin , checkout , $check_in , और $check_out सभी datetime . का समाधान करेंगे प्रकार)
SELECT *
FROM room
WHERE room_id NOT IN
(SELECT room_id
FROM bookings
WHERE
(checkin <= '$check_in' AND checkout >= '$check_in') OR
(checkin <= '$check_out' AND checkout >= '$check_out') OR
(checkin >= '$check_in' AND checkout <= '$check_out'))