Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top