Представьте, что у меня есть таблица, содержащая все главы книги и начальную / конечную страницу каждой главы.
chapter | start_page | end_page
--------------------------------------
1 | 1 | 24
2 | 25 | 67
3 | 68 | 123
4 | 124 | 244
5 | 245 | 323
Я пытаюсь выяснить, на какую главу попадает случайная страница, давайтескажем, на странице 215. Например,
Моя первая идея состояла в том, чтобы использовать такой запрос
SELECT `chapter`
FROM `book`
WHERE `start_page` <= 215
AND `end_page` >= 215
К сожалению, MySQL не может использовать индексы в вышеупомянутом запросе, что является большой проблемой из-забольшой размер моей таблицы.
После некоторого исследования я пришел к этому запросу, который использует индексы.
SELECT `chapter`
FROM `book`
WHERE `start_page` <= 215
ORDER BY `start_page` DESC
LIMIT 1
Теперь проблема в том, что я хочу иметь возможность запрашивать несколькослучайные страницы, все еще используя преимущества индексов.Кажется маловероятным, что я смогу изменить свой последний запрос, так как он сильно зависит от ограничения результатов до одного.
Любой совет будет высоко оценен!
ОБНОВЛЕНИЕ: Благодаря комментарию Рэя Тула у меня есть запрос, который дает мне результаты, которые мне нужны, с потрясающей производительностью.
SELECT chapter
FROM book
WHERE (start_page = (SELECT max(start_page) FROM book WHERE start_page <= 73) AND end_page >= 73)
OR (start_page = (SELECT max(start_page) FROM book WHERE start_page <= 92) AND end_page >= 92)
OR (start_page = (SELECT max(start_page) FROM book WHERE start_page <= 300) AND end_page >= 300)