Подзапрос или двойной запрос?

Для клиента я создал веб-сайт о путешествиях. Теперь они попросили меня оптимизировать и автоматизировать некоторые вещи. Одна из этих вещей заключается в том, что места размещения, показанные в списке поиска, должны быть бронируемыми.

Упрощенно, это структура

У меня есть объект размещения, объект размещения имеет 1 или более ценовых периодов.

Что мне нужно сделать, чтобы выбрать последний ценовой период, связанный с данным жильем. Период цены имеет поле date_until, которое является отметкой времени. В запросе должна быть сделана проверка, текущая временная метка должна быть меньше последней временной метки из ценового периода.

Это легко сделать со вторым запросом, который просто получает последнюю временную метку из таблицы priceperiod из всех строк priceperiod, связанных с данным размещением.

Мне интересно, является ли это лучшим случаем, или если Я должен использовать подзапрос для этого. И если да, то как будет выглядеть такой запрос? У меня нет большого опыта работы с подзапросами.

Обновление

Структура таблицы (простая)

Размещение -> ID

PricePeriod -> ID | AccommodationID | DateUntil

Упрощено:

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

Но я бы хотел это сделать одним запросом. Я надеюсь, что так будет ясно ..

1
задан Ben 12 November 2011 в 14:01
поделиться

1 ответ

Это зависит от ряда вещей, но что вы должны сделать, это попробовать несколько разных альтернатив.

Лично я бы так и сделал:

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, чтобы попытаться увидеть, насколько они «тяжелые»...

2
ответ дан 2 September 2019 в 22:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: