网页中分页的数据查询
有些网页中通常会有一个分页的样式,点击上一页或者下一页或者是具体的某一页的页码,页面中可以显示具体的从数据库查询的对应的数据。
以下介绍两种分页查询的方法。
第一种也是最常用的,就是通过数据库的limit来指定查找某个位置的几条数据。limit语法格式为:
limit[offset] rows
offset--是偏移量,也就是跳过表中多少条数据之后在查询,可省略,表示从第一条开始;
rows--是需要查询的具体的条数;
例如:
①select * from db limit 10000,100
上边SQL语句表示从表db中拿数据,跳过10000行之后,拿100行
②select * from db limit 0,100
表示从表db拿数据,跳过0行之后,拿取100行
③select * from db limit 100
这条SQL跟②的效果是完全一样的,表示拿前100条数
然后用这种方法进行分页查询的时候,则需要传递两个参数,第一个是page,也就是第几页,第二个是num,也就是每一页需要多少条数据。
然后sql语句则可以写为:
select * from db limit (page-1)*num,num
select * from db order by id limit (page-1)*num,num
以上的sql语句就可以在db的表中查询到对应的数据,两种方法都可以实现,后面一句加上order by 是因为有些时候,查询的时候需要从后面往前面查询,这时就需要用order by对数据进行排序,默认是升序,若需降序,则在后面添加DESC降序排列。
但是这种方法有一个缺陷,如果数据条数不多,则没什么影响。但是如果数据量很大,因为limit是将偏移量的数据和需要的数据一起查询出来,然后只取后面需要的数据。比如limit 100000,10;这样明明只需要10条数据,但是却在数据库中查询了100010条数据。大大的浪费了资源。可以用下面的方法来解决:
原sql语句:
select *
from mytbl
order by id
limit 100000,10
修改之后:
select *
from mytbl
where id >=
(
select id
from mytbl
order by id
limit 100000,1
)
limit 10
注:假设id是主键,内层是通过主键判断,外层也是通过主键查询,所以性能大大提升了。
以上就是通过limit来分页查询。
当数据库数据量不是很大的时候,还有一种方法:
就是先把数据库中所有的数据全部查询出来,在js中用ajax去查询并用一个数组保存。
然后在js中定义两个全局变量,一个是page(第几页),一个是num(每页的数量)。
然后再通过一个for循环将数组中指定的数据渲染到页面中。如:
var questions = data.res_body;
var html = `<tr style="background-color: #ccc">
<th class="col-md-1 text-center">#</th>
<th class="col-md-3 text-center">易错内容</th>
<th class="col-md-3 text-center">错在哪</th>
<th class="col-md-3 text-center">如何解决</th>
<th class="col-md-2 text-center" colspan="2">操作</th>
</tr>`;
// console.log(questions[0]);
for(var i = num*(page-1);i<num*page;i++){
// console.log(i);
if(questions[i]){
html += `<tr>
<td>${questions[i].id}</td>
<td>${questions[i].question}</td>
<td>${questions[i].where}</td>
<td>${questions[i].answer}</td>
<td>
<a href="#" id="xg">修改</a>
</td>
<td>
<a href="#" id="del">删除</a>
</td>
</tr>`;
}
}
这个方法不建议使用,因为需要将数据库中所有的数据全部查询出来,然后再进行渲染,大大的浪费了资源。推荐使用第一种。
欢迎关注微信公众号:猴哥说前端