0

想象一下,您有一个 1m 的记录表,并且您想将搜索结果限制在 10,000 条以内,并且不超过 10,000 条。那我有什么用呢?好吧,答案是使用限制条款。

例子

select recid from mytable order by recid asc limit 10000

这将为我提供输入到此表中的最后 10,000 条记录。

到目前为止没有分页。但是限制短语已经在使用。

这将问题带到了一个新的水平。

如果我想一次翻阅此记录特定记录集 100 个记录,该怎么办?由于该 limit短语已经是原始查询的一部分,我该如何再次使用它,这次来处理分页?

如果组织。查询开始时没有限制子句,我会先调整它limit 0,100,然后再调整它limit 100,100,然后limit 200,100在分页过程中进行调整。但此时,我不能。

你几乎认为你想一个接一个地使用两个限制短语——这是行不通的。

limit 10000 limit 0,100肯定会出错。

那么在这种特殊情况下的解决方案是什么?

[编辑]

在我发布这个问题后,我意识到 org. 一旦分页例程启动,查询就变得毫无意义。我不知何故让自己感到困惑,尽管这 order by recid asc limit 10000完全是 where 子句的一部分。实际上,该limit 10000部分与记录集内容无关 - 除了将记录集限制在请求的限制之外。因此,一旦分页开始,就没有必要保持 10000 的限制。很抱歉在这件事上浪费了你的时间。:(

4

5 回答 5

1

偏移量建议是一个很好的建议,您可能应该使用它。但是,如果由于某种原因偏移量不符合您的需求(例如插入新记录的人会稍微改变您的页面),您还可以在查询中添加 where recid > #### 子句。这就是您在使用 Twitter API 时的分页方式。

这是 PHP 中的一个示例。

    <?php
        $query = 'select recid from mytable';
        if(isset($_GET['recid'])&&$_GET['recid']!=''){
            $query = $query.' where recid > '.$_GET['recid'];
        }
        $query = $query.' order by recid asc limit 10000';

        //LOG INTO MYSQL

        $result = mysql_query($query);
        $last_id = '';

        while ($row = mysql_fetch_assoc($result)) {
             //DO YOUR DISPLAY WORK
             $last_id = $row['recid'];
        }

        echo '<a href="?recid='.$last_id.'>Next Page</a>';
   ?>

同样,比需要的要复杂一些,但会返回设置的页面。

于 2012-10-03T21:48:09.610 回答
1

我会说摆脱第一个限制,然后不要费心对表格进行计数,或者取计数和限制中的较小者,即 10000,并以此为基础进行分页。

IE

$perpage = 100;
$pages = $totalcount/$perpage;
$page = $get['Page'];
if($page > $pages || $page < 0)
{
     $page = 0;
}
$limit = "LIMIT " . ($page * $perpage) . ", " . $perpage;

要计算总数,请执行

SELECT COUNT(*) FROM mytable

然后根据您的限制检查它,即

if($totalcount > 10000)
{
    $totalcount = 10000;
}

进行专用计数查询的原因是它需要很少的 DB 到 PHP 数据传输,并且与全表 SELECT 查询相比,许多 DBMS 可以优化其中的废话。

于 2012-10-03T21:30:17.967 回答
1

LIMIT 可以有两个参数,第一个是偏移量,第二个是要返回的记录数。所以

LIMIT 5,10

将跳过前 5 条记录,然后获取接下来的 10 条。

您必须根据当前页面设置限制。就像是

LIMIT (CURRENT_PAGE  -1) * PAGE_SIZE , PAGE_SIZE

因此,如果您每页有 10 条记录并且在第 2 页,您将跳过前 10 条记录并抓取接下来的 10 条。

于 2012-10-03T21:34:51.500 回答
0

您可以使用偏移量变量。如果这是您的完整查询,那么您可以使用:

select recid from mytable order by recid asc limit 100 offset 300

例如会给你从 300-399。显然,您将为每页增加 100 的偏移量。所以对于第一页偏移 = 0,对于第二页偏移 = 100,等等。

一般偏移量 = (page-1)*100

正如@Mathieu Lmbert 所说,您可以确保偏移量不会达到 9900。

于 2012-10-03T21:27:53.343 回答
-2

实际上只能有一个限制,并且必须在查询中。因此,唯一的解决方案是调整查询中的 LIMIT 子句。

您不应该做的是阅读所有 10.000 个条目,丢弃您不想要的 9900 个条目。

于 2012-10-03T21:28:28.180 回答