Wyobraź sobie, że mam tabelę zawierającą wszystkie rozdziały książki i stronę początkową/końcową z każdego rozdziału.Jak mogę wykonać zapytanie między dwiema kolumnami, jednocześnie korzystając z indeksów?
chapter | start_page | end_page
--------------------------------------
1 | 1 | 24
2 | 25 | 67
3 | 68 | 123
4 | 124 | 244
5 | 245 | 323
Próbuję dowiedzieć się, na jaki rozdział przypada przypadkowa strona, na przykład strona 215.
Moim pierwszym pomysłem było użyć kwerendy jak ten
SELECT `chapter`
FROM `book`
WHERE `start_page` <= 215
AND `end_page` >= 215
Niestety MySQL nie mogą skorzystać z indeksami w powyższej kwerendy, która jest dużym problemem ze względu na duże rozmiary moim stole.
Po przeprowadzeniu badań wpadłem na to zapytanie, które wykorzystuje indeksy.
SELECT `chapter`
FROM `book`
WHERE `start_page` <= 215
ORDER BY `start_page` DESC
LIMIT 1
Problem polega na tym, że chcę mieć możliwość wysyłania zapytań na wiele losowych stron przy jednoczesnym korzystaniu z indeksów. Nie wydaje mi się prawdopodobne, że mogę zmodyfikować moje ostatnie zapytanie, ponieważ jest tak mocno uzależnione od ograniczania wyników do jednego.
Każda rada byłaby mile widziana!
UPDATE: Dzięki komentarzem Ray Toal Mam kwerendy, która daje mi wyniki muszę z niezwykłą wydajność.
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)
Czy w jednym zapytaniu chciałbyś przesłać kilka stron i uzyskać w rezultacie tabelę z numerami stron sparowanymi z ich rozdziałem? –
Potrzebuję tylko tabeli numerów rozdziałów w wyniku. Nie wymagam ich sparowania z numerami stron. – Chip
Więc jakoś chcesz przesłać zestaw numerów stron jak 73, 92, 300 i chcesz odzyskać 3 i 5, prawda? –