【发布时间】:2011-09-17 00:05:00
【问题描述】:
假设我有一个表格,其中包含一本书的所有章节以及每章的开始/结束页面。
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
现在的问题是我希望能够查询多个随机页面,同时仍然利用索引。我似乎不太可能修改我的最后一个查询,因为它非常依赖将结果限制为一个。
任何建议将不胜感激!
更新: 感谢 Ray Toal 的评论,我有一个查询,它以惊人的性能为我提供了我需要的结果。
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)
【问题讨论】:
-
您是否希望在一个查询中提交多个页面并作为结果获得一个带有与其章节配对的页码的表格?
-
我只需要结果中的章节编号表。我不要求它们与页码配对。
-
所以您想提交一组页码,例如 73、92、300,并希望返回 3 和 5,对吗?
-
正确,这正是我想要的。
-
对不起,这个让我难过。如果只有 一个 输入页面,您可以使用第二个查询,这很好,或者
SELECT chapter FROM book WHERE start_page = (SELECT max(start_page) FROM book WHERE start_page <= ?) AND end_page >= ?。有什么方法可以修改此查询以接受多个输入?我现在根本看不到一种方法来表达输入的多个页码。有趣的问题。