【问题标题】:What is a query offset?什么是查询偏移量?
【发布时间】:2009-07-29 01:12:43
【问题描述】:

我在 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

如您所见,我们可以假设我们有用于 Items 模型的 get_items 方法,它接收 2 个参数,$page_no 和 10(如图所示)。我知道 10 是要获取的项目数,而 $page_no 是从偏移量开始的页面

我大概可以实现10个参数的limit sql语句,但是$page_no会对应什么sql语句呢? Kohana 关于“从偏移开始的页面”是什么意思

【问题讨论】:

    标签: mysql kohana


    【解决方案1】:

    对应一个LIMIT语句:

    SELECT something FROM table LIMIT $limit OFFSET $offset;
    
    //or alternatively
    SELECT something FROM table LIMIT $offset,$limit;
    

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

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

    MySQL 文档中的更多信息:

    12.2.8 SELECT Syntax

    免责声明: $limit$offset 在此问题中仅用于帮助理解。当然,您不希望在没有正确转义值的情况下构建查询。

    【讨论】:

    • 您可能还希望实际将页码乘以限制数量,以获得明显的分页行为,否则,您只会跳过单行,而不是页面大小的行块。跨度>
    【解决方案2】:

    不幸的是,该特定评论混淆了在查询中考虑分页或分组的两种常见方法。正如 Andrew 所描述的,SELECT 语法允许 OFFSET parameter,即在返回任何内容之前要跳过的项目数。但是,它最常与分页一起使用,例如在 pagination library 中引用您的引文。在这种情况下,询问具体的页码会更有用。

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

    SELECT * FROM table WHERE searched LIMIT 10 OFFSET 20
    

    SELECT * FROM table WHERE searched LIMIT 20,10
    

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

    $offset = max($page_no - 1, 0) * $limit;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-12
      • 2012-05-30
      • 2017-06-15
      • 1970-01-01
      • 1970-01-01
      • 2015-10-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多