想象一下,您有一个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。我很抱歉浪费你的时间。 :(
答案 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个。