MySQL’de toplam satır sayısını bulmak (SQL_CALC_FOUND_ROWS)

12 Temmuz 2007

Başlık pek açıklayıcı olmadı aslında. Direkt olarak örnekle açıklayayım olayı:
Mesela bir ürün tablonuz var. Ürünleri kategorilerine göre listelemek istiyorsunuz. Bununla da yetinmeyip sayfa başına en fazla 20 tane ürün bulunacak şekilde sayfalama yapmak istiyorsunuz. Temel bilgilere sahip bir yazılımcının tercih edeceği yöntem şuna benzer birşey olur:

Öncelikle sayfalamayı yapabilmek için bu kategorideki toplam ürün sayısını bulmanız gerekir. Bunu şu sorguyla yaparsınız:
SELECT count(id) AS data_count FROM urunler WHERE kategori_id=’3′

Sonra da göstereceğiniz ürünleri
SELECT * FROM urunler WHERE kategori_id=’3′ LIMIT 0,20
sorgusu ile alıp listeleme işlemini yaparsınız. Sonraki sayfalarda satır sayısını tekrar tekrar hesaplamak istemiyorsanız bulduğunuz satır sayısını ‘SESSION’ ya da ‘COOKIE’ kullanarak saklayabilirsiniz. Bu işlemlerdeki sorun aynı sorguyu biraz değiştirerek iki kere yazmanız gerekmesidir. Bu zaman zaman sıkıntı yaratabilir.

MySQL insanları 4. versiyonu çıkarmadan önce oturmuşlar, bu işlemleri tek seferde yapabilmemiz için SQL_CALC_FOUND_ROWS diye birşey yapmışlar.

Bu durumda sorgunuzu şöyle yazıyorsunuz: “SELECT SQL_CALC_FOUND_ROWS * FROM urunler WHERE kategori_id=’3′ LIMIT 0,20“. Böylece ikinci bir count() sorgusu olmadan işinizi görmüş oluyorsunuz.

Örnek Java kodu:

conn = getConnection();
stmt = (Statement) conn.createStatement();
String sql = "SELECT SQL_CALC_FOUND_ROWS * FROM urunler "+
                "WHERE kategori_id='3' LIMIT 0,20";
int count=0;
 
//urunleri al
ResultSet rs = stmt.executeQuery(sql);
while(rs.next()) {
     //biseyler yap
}
 
//toplam urun sayisini bul
ResultSet rs2 = stmt.executeQuery("SELECT FOUND_ROWS()");
if(rs2.next()) count = rs2.getInt(1);

Örnek PHP kodu:

$count=0; //toplam veri sayisi
$sql = "SELECT SQL_CALC_FOUND_ROWS * FROM ".
         "urunler WHERE kategori_id='3' LIMIT 0,20";
//urunleri al
if($query = mysql_query($sql)){
    while($rs=mysql_fetch_array($query)){
          //biseyler yap
    }
}
 
//urun sayisini bul
$sqlCount = "SELECT FOUND_ROWS()";
$queryCount = mysql_unbuffered_query( $sqlCount);
$rsCount = mysql_fetch_row($queryCount);
$count = $rsCount[0];

Bu şekilde işleriniz büyük ölçüde kolaylaşır. Fakat bilginiz olsun, kimi durumlarda SQL_CALC_FOUND_ROWS kullanmak performans sorun yaratabilir (Kimi durumlar: mesela büyük bir tablodan ORDER BY, GROUP BY içeren bir sorguyla veri çekmek sorun yaratabilir). http://bugs.mysql.com/bug.php?id=18454 adresinde konu ile sorunları görebilirsiniz.

Bu yazıyı oylayın

1 Yıldız2 Yıldız3 Yıldız4 Yıldız5 Yıldız (2 oy, ortalama: 4,00 / 5)
Loading ... Loading ...

Konular: Programlama
Etiketler: , ,


Yorumlar

Yorum bırakın