Imagine que tengo una tabla que contiene todos los capítulos de un libro y la página de inicio/final de cada capítulo.¿Cómo puedo consultar entre dos columnas sin dejar de aprovechar los índices?
chapter | start_page | end_page
--------------------------------------
1 | 1 | 24
2 | 25 | 67
3 | 68 | 123
4 | 124 | 244
5 | 245 | 323
Estoy tratando de averiguar en qué capítulo cae una página al azar, digamos página 215 por ejemplo.
Mi primera idea era utilizar una consulta como esta
SELECT `chapter`
FROM `book`
WHERE `start_page` <= 215
AND `end_page` >= 215
Desafortunadamente MySQL no puede tomar ventaja de los índices de la consulta anterior que es un problema grande debido al gran tamaño de mi mesa.
Después de investigar un poco, se me ocurrió esta consulta que aprovecha los índices.
SELECT `chapter`
FROM `book`
WHERE `start_page` <= 215
ORDER BY `start_page` DESC
LIMIT 1
El problema ahora es que quiero la capacidad de consultar varias páginas al azar sin dejar de aprovechar los índices. No parece probable que pueda modificar mi última consulta, ya que depende en gran medida de limitar los resultados a uno.
¡Cualquier consejo sería muy apreciado!
ACTUALIZACIÓN: Gracias a un comentario de Ray Toal Tengo una consulta que me da los resultados que necesito con un rendimiento increíble.
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)
¿Desea la idea de que, en una consulta, envíe varias páginas y obtenga como resultado una tabla con números de página vinculados con su capítulo? –
Solo necesito una tabla de números de capítulo en el resultado. No necesito que aparezcan con los números de página. – Chip
Entonces, de alguna manera, desea enviar un conjunto de números de página como 73, 92, un 300 y desea obtener los números 3 y 5, ¿correcto? –