Immaginate Ho una tabella contiene tutti i capitoli di un libro e la pagina di inizio/fine di ogni capitolo.Come posso eseguire una query tra due colonne sfruttando ancora gli indici?
chapter | start_page | end_page
--------------------------------------
1 | 1 | 24
2 | 25 | 67
3 | 68 | 123
4 | 124 | 244
5 | 245 | 323
sto cercando di scoprire che cosa capitolo una pagina a caso cade su, diciamo pagina 215, per esempio.
La mia prima idea era quella di utilizzare una query come questa
SELECT `chapter`
FROM `book`
WHERE `start_page` <= 215
AND `end_page` >= 215
Purtroppo MySQL non possa trarre vantaggio degli indici nella query di sopra del quale è un grande problema a causa delle grandi dimensioni del mio tavolo.
Dopo aver fatto alcune ricerche sono arrivato fino a questa domanda che fa approfittare di indici.
SELECT `chapter`
FROM `book`
WHERE `start_page` <= 215
ORDER BY `start_page` DESC
LIMIT 1
Il problema ora è che desidero la possibilità di eseguire query su più pagine casuali sfruttando comunque gli indici. Non sembra probabile che io possa modificare la mia ultima query poiché è così fortemente dipendente dal limitare i risultati a uno.
Qualche consiglio sarebbe molto apprezzato!
UPDATE: Grazie ad un commento da Ray Toal Ho una domanda che mi dà i risultati che ho bisogno con prestazioni sorprendenti.
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)
è l'idea che si desidera, in una query, di presentare un numero di pagine e ottenere come risultato, una tabella con i numeri di pagina in coppia con il loro capitolo? –
Ho solo bisogno di una tabella di numeri di capitolo nel risultato. Non ho bisogno che siano abbinati ai numeri di pagina. – Chip
Quindi, in qualche modo, si desidera inviare una serie di numeri di pagina come 73, 92, un 300 e si desidera ripristinare 3 e 5, correggere? –