網(wǎng)頁中分頁的數(shù)據(jù)查詢
有些網(wǎng)頁中通常會有一個分頁的樣式,點(diǎn)擊上一頁或者下一頁或者是具體的某一頁的頁碼,頁面中可以顯示具體的從數(shù)據(jù)庫查詢的對應(yīng)的數(shù)據(jù)。
以下介紹兩種分頁查詢的方法。
第一種也是最常用的,就是通過數(shù)據(jù)庫的limit來指定查找某個位置的幾條數(shù)據(jù)。limit語法格式為:
limit[offset] rows
offset--是偏移量,也就是跳過表中多少條數(shù)據(jù)之后在查詢,可省略,表示從第一條開始;
rows--是需要查詢的具體的條數(shù);
例如:
①select * from db limit 10000,100
上邊SQL語句表示從表db中拿數(shù)據(jù),跳過10000行之后,拿100行
②select * from db limit 0,100
表示從表db拿數(shù)據(jù),跳過0行之后,拿取100行
③select * from db limit 100
這條SQL跟②的效果是完全一樣的,表示拿前100條數(shù)
然后用這種方法進(jìn)行分頁查詢的時(shí)候,則需要傳遞兩個參數(shù),第一個是page,也就是第幾頁,第二個是num,也就是每一頁需要多少條數(shù)據(jù)。
然后sql語句則可以寫為:
select * from db limit (page-1)*num,num
select * from db order by id limit (page-1)*num,num
以上的sql語句就可以在db的表中查詢到對應(yīng)的數(shù)據(jù),兩種方法都可以實(shí)現(xiàn),后面一句加上order by 是因?yàn)橛行r(shí)候,查詢的時(shí)候需要從后面往前面查詢,這時(shí)就需要用order by對數(shù)據(jù)進(jìn)行排序,默認(rèn)是升序,若需降序,則在后面添加DESC降序排列。
但是這種方法有一個缺陷,如果數(shù)據(jù)條數(shù)不多,則沒什么影響。但是如果數(shù)據(jù)量很大,因?yàn)閘imit是將偏移量的數(shù)據(jù)和需要的數(shù)據(jù)一起查詢出來,然后只取后面需要的數(shù)據(jù)。比如limit 100000,10;這樣明明只需要10條數(shù)據(jù),但是卻在數(shù)據(jù)庫中查詢了100010條數(shù)據(jù)。大大的浪費(fèi)了資源??梢杂孟旅娴姆椒▉斫鉀Q:
原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
注:假設(shè)id是主鍵,內(nèi)層是通過主鍵判斷,外層也是通過主鍵查詢,所以性能大大提升了。
以上就是通過limit來分頁查詢。
當(dāng)數(shù)據(jù)庫數(shù)據(jù)量不是很大的時(shí)候,還有一種方法:
就是先把數(shù)據(jù)庫中所有的數(shù)據(jù)全部查詢出來,在js中用ajax去查詢并用一個數(shù)組保存。
然后在js中定義兩個全局變量,一個是page(第幾頁),一個是num(每頁的數(shù)量)。
然后再通過一個for循環(huán)將數(shù)組中指定的數(shù)據(jù)渲染到頁面中。如:
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">易錯內(nèi)容</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>`;
}
}
這個方法不建議使用,因?yàn)樾枰獙?shù)據(jù)庫中所有的數(shù)據(jù)全部查詢出來,然后再進(jìn)行渲染,大大的浪費(fèi)了資源。推薦使用第一種。
歡迎關(guān)注微信公眾號:猴哥說前端