Подзапрос или двойной запрос? - PullRequest
1 голос
/ 19 августа 2010

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

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

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

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

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

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

Обновление

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

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

PricePeriod -> ID |AccommodationID |DateUntil

Упрощено:

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

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

1 Ответ

2 голосов
/ 19 августа 2010

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

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

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

...