什么是查询偏移量?

9 mysql kohana

我在Kohana文档中看到了这个:

$content = new View('pages/items');
$items = new Items_Model;

$content->items = $items->get_items($page_no, 10); // page to get starting at offset, number of items to get
Run Code Online (Sandbox Code Playgroud)

如您所见,我们可以假设我们为Items模型提供get_items方法,该模型接收2个参数$ page_no和10(如此处所示).我知道10是要获取的项目数,$ page_no是从offset开始的页面

我可以为10参数实现一个限制sql语句,但是什么sql语句将对应于$ page_no?Kohana对"从偏移开始的页面"的意思是什么

And*_*ore 14

它对应于一个LIMIT声明:

SELECT something FROM table LIMIT $limit OFFSET $offset;

//or alternatively
SELECT something FROM table LIMIT $offset,$limit;
Run Code Online (Sandbox Code Playgroud)

换句话说,从表中选择一些东西,但只给我$limit从记录开始的记录$offset.

$offset = ($page_no - 1) * $limit
$page_no 是1基于.

MySQL文档中的更多信息:

12.2.8 SELECT语法

DISCLAMER: $limit$offset在这个问题只用来帮助理解.当然,如果没有正确的值转义,您不希望构建查询.


esw*_*ald 6

不幸的是,该特定评论混淆了两种常见的方式来考虑分页或分组查询.正如Andrew所描述的,SELECT语法允许OFFSET参数,即在返回任何内容之前跳过的项目数.但是,它通常与分页一起使用,就像在您的引文中引用的分页库一样.在这种情况下,询问特定页码更有用.

要比较这两者,请考虑一个您已进行搜索并已转到第3页的情况,每页有10个项目.第1-20项是前两页; 因此,OFFSET参数将为20:

SELECT * FROM table WHERE searched LIMIT 10 OFFSET 20
Run Code Online (Sandbox Code Playgroud)

要么

SELECT * FROM table WHERE searched LIMIT 20,10
Run Code Online (Sandbox Code Playgroud)

不幸的是,$page_no引用示例中的参数可能希望是3,即页码.在这种情况下,必须计算SQL偏移量.鉴于这get_items似乎不是一个标准的模型方法,它可能在那里计算; 或者,分页库似乎有一个属性sql_offset,可能会为你计算它.无论哪种方式,计算都很容易:

$offset = max($page_no - 1, 0) * $limit;
Run Code Online (Sandbox Code Playgroud)