سؤال

بالنسبة لعميل ، قمت ببناء موقع Travelagency. الآن طلبوا مني تحسين بعض الأشياء وأتمها. أحد هذه الأشياء هو أن أماكن الإقامة الموضحة في قائمة البحث يجب أن تكون قابلة للحجز.

تبسيط هذا هو الهيكل

لديّ أماكن الإقامة ، ويحتوي أماكن الإقامة على 1 أو أكثر من برايسبيريود.

ما أحتاج إلى القيام به آخر برايبيريود متصل بإقامة معينة. يحتوي PricePeriod على حقل "Date_until" ، وهو طابع زمني. في الاستعلام ، يجب إجراء فحص ، يجب أن يكون الطابع الزمني الحالي أقل من الطابع الزمني الأخير من PricePeriod.

من السهل القيام بذلك مع الاستعلام الثاني الذي يحصل فقط على آخر طابع زمني من جدول PricePeriod من جميع الصفوف البريدية المتصلة بالإقامة المحددة.

أتساءل عما إذا كانت هذه هي أفضل حالة ، أو إذا كان ينبغي علي استخدام مسمة فرعية لهذا الغرض. وإذا كان الأمر كذلك ، كيف سيكون هذا الاستعلام مثل هذا؟ ليس لدي الكثير من الخبرة مع الفائزين الفرعيين.

تحديث

هيكل الجدول (بسيط)

الإقامة -> معرف

PricePeriod -> id | أماكن الإقامة | Dateuntil

مبسط:

SELECT fieldlist FROM Accommodation WHERE ID = $id
SELECT MAX(DateUntil) FROM PricePeriod WHERE AccommodationID = $id

لكني أود أن هذا في استفسار واحد. أتمنى أن يكون الأمر واضحًا بهذه الطريقة ..

هل كانت مفيدة؟

المحلول

يعتمد ذلك على عدد من الأشياء ، ولكن ما يجب عليك فعله هو تجربة بعض البدائل المختلفة.

شخصيا ، سأفعل:

SELECT fieldlist, 
(SELECT MAX(DateUntil) FROM PricePeriod) WHERE AccomidationID = a.id) AS last_date
FROM Accommodation AS a
WHERE a.id = $id

يمكنك أيضًا القيام بذلك (ولكن قد لا يكون فعالًا) ...:

SELECT fieldlist, MAX(b.DateUntil)
FROM Accommodation AS a
JOIN PricePeriod AS b ON a.id = b.AccommodationID
WHERE a.id = $id
GROUP BY a.id

الشيء الكبير هو تجربتها جميعًا (تأكد من استخدامها SQL_NO_CACHE بحيث تكون النتائج صحيحة في كل مرة). قم بتشغيلها EXPLAIN لمحاولة رؤية مدى "ثقيلة" ...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top