programlı sonuç sayısını belirlemek için sql sorgusunun SELECT alanları değiştirmek

5 Cevap php

Herhangi bir sorgu (gruplama, katılır ve alt sorgular herhangi bir kombinasyon içinde tüm mümkündür) göz önüne alındığında, ben mümkün olduğunca verimli pagination ile onu kırmak istiyorum. Şu anda ben sadece geçerli sayfaya gitmek olanları görüntülemek verilerin kaç sayfa anlamaya, satır sayısı PHP döndü saymak sonra, sorguyu çalıştırmak ve çıkış diğer sayfalara uygun bağlantılar.

Sorgudan potansiyel çok büyük bir sonuç kümesi çoğunlukla ancak israf gibi geliyor bana. Iki sorguyu çalıştırmak için bir yolu var mı nerede satırlar paginated ve sayfanın dayalı uygun sınırları ile özgün sorguyu çalıştırmak ikinci kez anda izlenen ile tek bir numara almak için SAYISININ seçeneğini ilk kez (*)? Bu veritabanı sunucusu üzerinde önemli ölçüde daha az yıpratıcı olurdu?

Önemsiz bir sorgu için bu sorun yok ... seçtikten sonra her şeyi değiştirmek ve NEREDE sayısı (*) ile daha önce. Sorguda gruplandırma varsa ancak bu her grubun değil, satır sayısı olarak sayısını alırsınız gibi çalışmaz. Eğer sütun üzerinde a, b, c ve gruplama ediyorsanız o sayısı seçmek doğru (farklı a, b, c)? Alt sorgular işlemek için yapılması gereken şey özel bir ihtiyaç mı?

5 Cevap

Muhtemelen sonraki kullanabilirsiniz:

select count(*)
from (<original select query>)

Sen SQL_CALC_FOUND_ROWS size küçük bir sonuç kümesini vermek için kullanabilirsiniz, ama aynı zamanda MySQL sınırsız sonuç kümesinin boyutunu hesaplamak var:

SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name LIMIT 10;

SELECT FOUND_ROWS();

Bu yardımcı olabilir: mysql limit özelliği vardır:

select * 
from mytable
limit 10,40

Nerede limit 10,40 Bana (bazlı 0 olan) sonuç 10 ile başlayan 40 sonuç verir demektir.

Bu özelliği sayfalamayı inşa olabilir. Yukarıdaki örnekte, 40 40 Sonuç / sayfa anlamına gelir.

Sen SQL_CALC_FOUND_ROWS kullanarak sınır koşulu olmadan iade olurdu satır sayısını hesaplamak için mySQL sorabilirsiniz.

Bu size 20 ilk sayfasını verecektir:

SELECT SQL_CALC_FOUND_ROWS * FROM table LIMIT 0,20

Sonra SQL_CALC_FOUND_ROWS olmadan iade olurdu satır sayısı için sorabilirsiniz:

SELECT FOUND_ROWS() AS numrows

Bu veritabanı sunucusu başka bir talebi olmaksızın sürücüsünden cevap verilecektir. Ayrıca daha karmaşık sorgu ile çalışması gerekir.

Ben herhangi bir performans yararı olmadığını görmek için geliştirme ortamında biraz deneme olacaktır.

Sen MercerTraieste anlaşılacağı gibi, ancak şimdi genellikle önlemek için bir şeydir sayfa başına veritabanına, bir gezi yapıyoruz, LIMIT ifadesini kullanarak sayfa başına kayıtlarına dayalı dönüş sonucu sınırlayabilir. Ben PHP komut MySQL sunucudan veri almak için bir imleç kullanır varsayalım, ve ben imleci diğer sayfalar için bu verileri almak için açık kalır düşünün. By doing LIMITed queries, you might actually tax the database server more. Eğer varsa tabii, ben, bir MySQL performans izleme aracını kullanarak veritabanı yükünü izleyerek öğrenmek için / deney test olacaktır.

Muhtemelen hatta sadece sayfa başına istediğiniz kaç kayıtları belirlemek, onları sayfalandırmamayı bir COUNT (*) yapmak zorunda olmayacak ve sadece onları farklı bir sonuç noktalarından başlayarak döndürür.

Yani, (psuedocode takip) yok

SELECT <columns> FROM <table> LIMIT <records-per-page>;
while (More data available for future pages)
{
    records-shown += records-per-page;
    SELECT <columns> FROM <table> LIMIT <records-per-page>,<records-shown>;
}

Kuşkusuz, bunu yapmanın başka yolları da muhtemeldir temiz.