是没看懂你说什么,其实只要计算好当前页显示的第一条数据row number、和每页最多显示的行数($rowsperpage),以及所有符合条件的数据的总行数,就可以了。
比如,直接 goto 到N页,就算出第N页应该从哪条数据开始显示($rows),然后"SELECT *......... limit $rows,$rowsperpage", 再把结果集逐条显示出来。看这个文章最后有个例子可以下载看看吧
http://www.phpe.net/articles/382.shtml
比如,直接 goto 到N页,就算出第N页应该从哪条数据开始显示($rows),然后"SELECT *......... limit $rows,$rowsperpage", 再把结果集逐条显示出来。看这个文章最后有个例子可以下载看看吧
http://www.phpe.net/articles/382.shtml
limit 效率不行,我有80W条记录
limit $rows,$rowsperpage,这种做法,我一直是这么做的
现在数据大了,效率不行
这种办法显然不行,撞上大量cover记录会翻到全空白的页LZ是否弄错了?
where view='show',而不是=='show'
即便是你在贴的时候笔误了,该SQL语句也是实现说把符合记录为show值的查询出来,然后再取结果集合的[N,M]。
你先把那个问题解决了吧。后面的那一大段程序就没看了,不好意思!
('show','cover') 才两种可能,mysql 没有postgresql那种类别索引
$query = "SELECT COUNT(*) FROM guestbook WHERE viewmode='show'";
$result = mysql_query($query);
$count = mysql_fetch_row($result);$totalpage = ceil($count[0]/$rowsperpage);
if ($page > $totalpage) $page = $totalpage;
if ($page < 0) $page = 1;$query = "SELECT * FROM guestbook WHERE viewmode='show' LIMIT ".
($page-1) * $rowsperpage ", $rowsperpage";
$result = mysql_query($query);
while ( $row = mysql_fetch_array($result))
{
$data[] = $row;
}这么简单的逻辑怎么被你写成这样?
用id做限制条件吧。会快
除非n溢出
$query = "SELECT COUNT(*) FROM guestbook WHERE viewmode='show'";
$result = mysql_query($query);
$count = mysql_fetch_row($result);$totalpage = ceil($count[0]/$rowsperpage);
if ($page > $totalpage) $page = $totalpage;
if ($page < 0) $page = 1;$query = "SELECT * FROM guestbook WHERE viewmode='show' LIMIT ".
($page-1) * $rowsperpage ", $rowsperpage";
$result = mysql_query($query);
while ( $row = mysql_fetch_array($result))
{
$data[] = $row;
}
正解!!!!速度的快慢主要是生成临时表的大小及多少,如果生成临时表有80W条,你只拣其中的10条来用,铁打的服务器也受不了这样的折腾!!!!
如果你用10条就生成10条,这下应该轻松不少吧。用LIMIT分页后临时生成的表很小,效率很高。简单明了,思路清晰,好程序!!楼主的代码有问题,让人看不懂,要正确应用SQL内嵌函数。
你的说法就不讨论了,自己回去随便建张表,导入10万数据,然后尝试
select * from table_name limit 0,30;
select * from table_name limit 90000,30;带上查询条件的就更不用说了,
关键是满足搜索条件的结果集有多大,limit从什么位置开始。
to axolo(七月十五) :
不知所谓,也许是自定义的名词别人看不懂,呵呵。
也或许说的不是一回事,呵呵
对于第n页,(每页m条记录):
SELECT xxx FROM table_name WHERE where_definition LIMIT (n-1)*m, m;这样的查询实际上是把符合where_definition的结果前n*m个都遍历后,输出最后m条。
为了解决这个问题,我们采用缩小结果集的办法来实现。不难看出,第一页的语句:
SELECT xxx FROM table_name WHERE where_definition 0, m;
这是没有浪费的查询。
那么我们可以记录下这其中最大的流水号(假定结果按照流水号顺序排列)--maxId1,把这个值传给下一页。那么下一页的查询语句就是
SELECT xxx FROM table_name WHERE where_definition and id>maxId1 0, m;
结果集大小仍然只有m(因为查出前m个,就不再继续查了。)同理第n页就是
SELECT xxx FROM table_name WHERE where_definition and id>maxIdn 0, m;可以看看现在很多论坛什么的,它们现在没有了任意页跳转的功能,为什么?就是因为这个。在很多论坛里你会看到类似这样的翻页:首个10页 前一个10页 1 2 3 4 5 6 7 8 9 10 后一个10页 最后一个10页
原理都是一样的。数据库不是万能的,不是你怎么玩都行的,
不是说数据库不行,是要你怎样合理的利用它。