यह मानते हुए कि आप @Guests
place रखना चाहते हैं @StartDate
. से करने के लिए @EndDate
SELECT DISTINCT r.id,
FROM room r
LEFT JOIN roombooking_room rbr ON r.id = rbr.room_id
LEFT JOIN roombooking ON rbr.roombooking_id = rb.id
WHERE COALESCE(@StartDate NOT BETWEEN rb.startDate AND rb.endDate, TRUE)
AND COALESCE(@EndDate NOT BETWEEN rb.startDate AND rb.endDate, TRUE)
AND @Guests < r.maxGuests
आपको उन सभी कमरों की एक सूची देनी चाहिए जो मुफ़्त हैं और दी गई अवधि के लिए मेहमानों की दी गई संख्या को समायोजित कर सकते हैं।
नोट्स
यह क्वेरी केवल एकल कमरों के लिए काम करती है, यदि आप एकाधिक कमरों को देखना चाहते हैं तो आपको कमरों के संयोजन के लिए समान मानदंड लागू करने होंगे। इसके लिए आपको पुनरावर्ती प्रश्नों या कुछ सहायक तालिकाओं की आवश्यकता होगी। इसके अलावा, COALESCE NULLs की देखभाल करने के लिए है - यदि कोई कमरा बिल्कुल भी बुक नहीं किया गया है, तो उसके पास तुलना करने के लिए तारीखों के साथ कोई रिकॉर्ड नहीं होगा, इसलिए यह पूरी तरह से मुफ्त नहीं लौटेगा। कमरे। date1 और date2 के बीच की तिथि NULL वापस आ जाएगी यदि या तो date1 या date2 शून्य है और कोलेस इसे सत्य में बदल देगा (वैकल्पिक रूप से पूरी तरह से मुक्त कमरों का एक यूनियन करना है, जो तेज़ हो सकता है)।
कई कमरों के साथ चीजें वाकई दिलचस्प हो जाती हैं। क्या वह परिदृश्य आपकी समस्या का बड़ा हिस्सा है? और आप किस डेटाबेस का उपयोग कर रहे हैं यानी क्या आपके पास पुनरावर्ती प्रश्नों तक पहुंच है?
संपादित करें
जैसा कि मैंने पहले भी कई बार कहा है, यदि आप मेहमानों और कमरों की आवश्यक संख्या के बीच सबसे अच्छा फिट होना चाहते हैं, तो समाधान खोजने का आपका तरीका (लालची एल्गोरिथ्म जो सबसे पहले सबसे बड़े मुफ्त कमरों को देखता है) इष्टतम नहीं है।
इसलिए, यदि आप अपने foreach को
. से बदलते हैं$bestCapacity = 0;
$bestSolution = array();
for ($i = 1; $i <= pow(2,sizeof($result))-1; $i++) {
$solutionIdx = $i;
$solutionGuests = 0;
$solution = array();
$j = 0;
while ($solutionIdx > 0) :
if ($solutionIdx % 2 == 1) {
$solution[] = $result[$j]['id'];
$solutionGuests += $result[$j]['maxGuests'];
}
$solutionIdx = intval($solutionIdx/2);
$j++;
endwhile;
if (($solutionGuests <= $bestCapacity || $bestCapacity == 0) && $solutionGuests >= $noGuests) {
$bestCapacity = $solutionGuests;
$bestSolution = $solution;
}
}
print_r($bestSolution);
print_r($bestCapacity);
सभी संभव संयोजनों से गुजरेगा और ऐसा समाधान खोजें जो कम से कम रिक्त स्थान बर्बाद करे।