çekin ve numaralandırılmasında her sayfa için görüntü aralığı (min-max) veri nasıl?

1 Cevap php

Ben aranabilir ve sıralanabilir, ancak geniş aramalar için sonuç yüzlerce veya binlerce üretmek olasıdır veri bir tablo var. Kullanıcıyı varsayarak "foo" arar ve ben bu yüzden gibi bir hızlı atlama seçme menüsünü göstermek istiyorum fiyatı azalan foos sıralar:

<option value="1">Page 1 ($25,000,000 - $1,625,000)</option>
<option value="2">Page 2 ($1,600,000 - $1,095,000)</option>
<option value="3">Page 3 ($1,095,000 - $815,000)</option>
<option value="4">Page 4 ($799,900 - $699,000)</option>
...

DB doğrudan bu bilgileri sorgulamak etkili bir yolu var mı? Ben eşleşen tüm kayıtları kapma ve verimsiz ve ölçekleme sorunlara yol açması muhtemel görünüyor her sayfa için min ve max değeri hesaplamak için PHP kullanarak oldum.

Ben gelmek mümkün oldum mümkün tekniği olduğunu göre gruplandırma, her X kayıtları (bir sayfaya X kayıtları) artışlarla hesaplanan bir değişkene sahip ve her sayfa gruplandırma için MIN / MAX seçme bazı yoludur ... ne yazık ki ben bu değişkeni oluşturmak için bir yol ile gelmek mümkün olmamıştır.

1 Cevap

Teknik possible, ben bu özelliği ile zaman kaybetmeyin ve başka bir yaklaşım aramak için değil tavsiye ediyorum iken.

İlk olarak, pagination hakkında bazı arka plan bilgileri. Numaralandırma, tipik olarak ORDER BY ... LIMIT [offset], [rows] kullanılarak gerçekleştirilir. MySQL de size satırları verebilmek için bir ofset verilmiş, bu all önceki satırlar sonra onları çöpe atmak okumalıdır. Bu pahalı ve ofset ile maliyet artışları artan. (Örneğin SINIR 1000, 20 1020 satırları okumak ve sonra uzak 1000 atmak gerekir). ORDER BY bir dizin kullanılarak başarılı olamaz zaman bu daha da kötüdür. Bu entire sınırsız resultset okunan neden olabilir, daha sonra filesorted ve then ilk 1000 satır bir LIMIT 1000, 20 karşılamak için atılır.

Şimdi, sizin belirli bir sorunu ele alalım. Gösterildiği gibi, sayfalama "sihirli" bir şey değildir; Bu resultsets paginating bir oldukça kaba kuvvet yoludur. Özellikle, bir şey tüm resultset bir sıralama yapmadan vaktinden düşer hangi sayfa bilmiyorum. Bu rakam için, geçici tablolar kullanmanız gerekir, ve sonra bu geçici tablodan tüm resultset'de için sayfa başına min / max hesaplamak istiyorum dk ve sayfa başına max. Veri tüm uçucu ise, o zaman sık sık temel veri değişiklikleri gibi bu yeniden hesaplamak gerekiyordu.

Depolama motoru nasılsa her satır belirli bir sipariş için ne oldu "sayfa" saklanan, o zaman nispeten kolayca bunu başarabilir. Ne yazık ki durum böyle değildir.

Ayrıca, ben senin kullanıcılara yaklaşımın faydasını sorgulamak istiyorum. Sizin örnek fiyatlarla güzel bir dağılım gösterir. Eğer aşağıdaki gibi bir aralıklar ile sona olmaz emin olabilir miyim?

<option value="1">Page 1 ($1,005,000 - $1,004,000)</option>
<option value="2">Page 2 ($1,004,000 - $1,003,450)</option>
<option value="3">Page 3 ($1,003,450 - $1,003,387)</option>
<option value="4">Page 4 ($1,003,387 - $1,003,342)</option>

Bu kullanıcıya hiçbir yararı olacağını soru.

Suggestion

  • Lütfen pagination basit tutmak
  • Kullanıcıların filtresi olarak inşa sonra, fiyatları bir dizi seçebilmek istiyorsanız - pagination ile birleştirmek değil.

Example

Amazon bir şey aramak ve sonuçları sayfasını fark. Eğer arama sonuçları sadece paginated alırsınız. Solda da ayrıntılandırabileceksiniz arama uygulamak için çeşitli filtreler olacaktır.