php分页和限制子句的使用

时间:2012-10-03 21:24:00

标签: php pagination limit

想象一下,您有一个1米的记录表,并且您希望将搜索结果限制为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肯定会出错。

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

[编辑]

发布此问题后,我意识到组织中的限制为10000。一旦分页例程开始,查询就变得毫无意义。我以某种方式混淆了自己,尽管order by recid asc limit 10000完全是where子句的一部分。实际上,limit 10000部分与记录集内容无关 - 除了将记录集限制在请求的限制之外。因此,一旦分页开始,没有必要保持限制10000。我很抱歉浪费你的时间。 :(

5 个答案:

答案 0 :(得分:1)

我说要摆脱第一个限制,然后不要费心计算表,或者取较少的计数和你的限制,即10000,并根据它进行分页。

即。

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

要计算totalcount,请执行

SELECT COUNT(*) FROM mytable
然后检查它是否符合你的限制,即

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

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

答案 1 :(得分:1)

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

LIMIT 5,10

将跳过前5个记录然后获取下一个10。

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

这样的东西
LIMIT (CURRENT_PAGE  -1) * PAGE_SIZE , PAGE_SIZE

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

答案 2 :(得分:1)

偏移建议是一个很好的建议你应该使用它。但是,如果由于某种原因偏移不符合您的需求(比如插入新记录的人会稍微改变您的页面),您还可以添加一个recid&gt;您的查询的####子句。这是使用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>';
   ?>

再次,比需要更复杂但会返回设置页面。

答案 3 :(得分:0)

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

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

会给你300-399。显然,你会为每一页增加100的偏移量。因此,对于第一页offset = 0,对于第二页offset = 100等,

是一般偏移=(第-1页)* 100

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

答案 4 :(得分:-2)

实际上只有一个限制,它必须在查询中。所以唯一的解决方案是调整查询中的LIMIT子句。

你不应该做的就是阅读所有10.000个条目,扔掉你不想要的9900个。