Подпрограмма или двойной запрос?
Вопрос
Для клиента я построил веб -сайт Travelagency. Теперь они попросили меня оптимизировать и автоматизировать некоторые вещи. Одна из этих вещей заключается в том, что жилье, показанное в списке поиска, должно быть забронировано.
Упрощено это структура
У меня есть жилье, жилье имеет 1 или более цены.
Что мне нужно сделать, чтобы выбрать последний цену, связанный с данным жильем. Прайпериод имеет поле «date_until», которая является временной меткой. В запросе должен быть сделан чек, текущая временная метка должна быть меньше, чем последняя метка времени из цена.
Это легко сделать со вторым запросом, который просто получает последнюю метку времени из таблицы PricePeriod от всех цен на цену, связанных с данным жильем.
Мне интересно, является ли это лучшим случаем, или я должен использовать подложку для этого. И если да, то как будет подобный запрос? У меня нет большого опыта работы с подразделениями.
Обновлять
Структура таблицы (простая)
Жилье -> id
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
Чтобы попытаться увидеть, как они "тяжелые" ...