У меня есть этот запрос:
SELECT p.id, r.status, r.title
FROM page AS p
INNER JOIN page_revision as r ON r.pageId = p.id AND (
r.id = (SELECT MAX(r2.id) from page_revision as r2 WHERE r2.pageId = r.pageId AND r2.status = 'active')
OR r.id = (SELECT MAX(r2.id) from page_revision as r2 WHERE r2.pageId = r.pageId)
)
Возвращает каждую страницу и последнюю активную ревизию для каждой, если только активная ревизия недоступна, в этом случае просто возвращается последняя ревизия.
Есть ли способ оптимизировать его для повышения производительности или просто для удобства чтения? У меня сейчас нет проблем, но меня беспокоит то, что когда это попадет в производственную среду (где может быть много страниц), это будет плохо работать.
Кроме того, есть ли очевидные проблемы, о которых я должен знать? Использование подзапросов всегда вызывает у меня проблемы, но, насколько мне известно, это невозможно сделать без них.
Примечание:
Причина, по которой условия заключаются в предложении JOIN, а не в предложении WHERE, заключается в том, что в других запросах (где используется та же логика) я ВЗАИМОДЕЙСТВУЮ из таблицы «site» в таблицу «page», и если страниц не существует, я все еще хочу, чтобы сайт вернулся.
Jack
Редактировать: Я использую MySQL