SQL Numaralandırma

4 Cevap php

Bir web sayfasında kullanmak için bir SQL sorgusu sonuçlarını sayfalandırmamayı çalışıyorum. Dil ve veritabanı destekli PHP ve SQLite vardır.

Ben çalışan böyle bir şey kullanıyorum kodu (sayfa numaralandırma 0'dan başlar)

http://example.com/table?page=0

page = request(page)
per = 10 // results per page
offset = page * per

// take one extra record so we know if a next link is needed
resultset = query(select columns from table where conditions limit offset, per + 1)

if(page > 0) show a previous link
if(count(resultset) > per) show a next link

unset(resultset[per])

display results

Bu daha sayfalandırma yapmak için daha etkili yollar var mı?

Ben mevcut yöntemi ile görebilirsiniz bir sorun ben onları görüntülemeden başlamadan önce bellekte 10 (ya da ancak çok) sonuçları saklamak zorunda olmasıdır. PDO Rowcount geçerli olacağını garanti etmez, çünkü ben bunu.

, Sonra tarayıcıya sonuçları akışı o var kaç satır öğrenmek için bir COUNT (*) sorgu vermek için daha verimli mi?

Bu o "it sayısı (*) sorgu veri tabanı için tam bir tablo tarama gerektirir olmadığını tablonun büyüklüğüne bağlıdır, ve" tür soruları "Bazı kendini profil yok" biri mi?

4 Cevap

Ben sadece ilk sayısını yapıyor öneririm. Bir sayımı (birincil anahtar) çok etkili bir sorgu.

Bana diğer bir yöntem izin vermez son sayfasına doğrudan bir bağlantı oluşturmak için izin verir, çünkü ben, COUNT (*) iki sorgu yöntemi ile gitmek için tercih ettik. İlk sayısını Sahne da bana sonuçlarını akışı sağlar ve böylece daha az bellek ile kayıtları yüksek sayılar ile iyi çalışması gerekir.

Sayfalar arasında tutarlılık benim için bir sorun değildir. Yardımınız için teşekkür ederim.

Ben paginate gereken satır binlerce, dönen, oldukça karmaşık (9-12 tablo join) sorgu çeşitli durumlar vardır. Açıkçası güzel sayfalandırmamayı, size sonucu toplam boyutunu bilmek gerekir. Jüri yapmak için o daha verimli olup olmayacağı üzerinde olmasına rağmen MySQL veritabanları ile, SELECT SQL_CALC_FOUND_ROWS yönergesini kullanarak, kolayca bunu başarmak yardımcı olabilir.

Eğer SQLite kullanıyorsanız Ancak, ben 2 sorgu yaklaşımı ile yapışmasını öneririz. Here konuda bir çok özlü iplik.

Ben arka uç on satır dönmek için beklemek için kullanıcılar için bir sorun olacağını sanmıyorum. (Bu mümkün olduğunda, vb webserver sıkıştırılmış veri aktarımı müzakere yapmak, görüntü boyutlarını belirterek iyi kalarak onlara o kadar yapabilirsiniz)

Ben başlangıçta bir sayımını (*) yapmak için çok yararlı olacağını sanmıyorum.

Kullanıcı sayfa x bakıyor olduğunda, gelişmiş kullanıcı deneyimi için ajax benzeri sihirli önceden yük sayfa x 1 kullanın: Bazı karmaşık kodlama kadar iseniz.

A general note about pagination: If the data changes while the user browses through your pages, it may be a problem if your solution demands a very high level of consistency. I've writte a note about that elsewhere.