Kullanıcılarımıza veritabanındaki verileri gösterirken bunu verileri rastgele çekmek isteyebiliriz. Küçük bir veritabanından rastgele veri çekerken yaptığımız sorgu her harikalde hızlı gerçekleşecektir. Fakat büyük bir veri tabanı için aynı şeyi söyleyemeyiz. Yaptığım araştımalar sonucunda veri tabanından rastgele veri çekmek için bulduğum çözümleri sizinle paylaşacağım.
Veri tabanından "yazilar" adlı tablomuzdan 5 adet rastgele veri çekelim.
1. Sorgu
SELECT * FROM yazilar ORDER BY RAND() LIMIT 5
Bu sorguyu çalıştırdığımda en hızlı gerçekleştiği süre 0.006 ms oldu.
2.Sorgu
SELECT * FROM yazilar WHERE id IN (SELECT id FROM yazilar) ORDER BY RAND() LIMIT 5
Bu sorguda ise en hızlı gerçekleşme süresi 0.005 ms oldu.
3.Sorgu
SELECT * FROM yazilar AS y1 INNER JOIN (SELECT ( RAND() * (SELECT MAX(yazi_id) FROM yazilar) ) AS rand_id) AS y2 WHERE y1.yazi_id >= y2.rand_id LIMIT 5
Bu sorguda ise en hızlı gerçekleşme süresi 0.001 ms oldu.
PHP dizileri kullanarak rastgele veri çekme
Veritabanından rastgele veri çekerken php'de dizileri kullanacağız. Bu yöntemde izleyeceğimiz yolu sizlere vermek istiyorum.
- İlk olarak yazilar tablosundan bütün id leri çeken bir sorgu yap
- Sorgu sonucunda gelen bütün idleri bir diziye at
- Dizi içerisinden rastgele id seç
- Dizide rastgele seçilen idleri sql sorgusu içerisinde "... WHERE IN ($rastgele_id)" şeklinde yerleştir.
- Son olarak oluşan sql cümlesini sorguluyoruz.
Aşağıdaki kod veri tabanından rastgele 5 adet veri çeker.
<?php $baglan = mysql_connect('localhost', 'kullanici', 'parola'); mysql_select_db('veri_tabani_adi', $baglan); $sql = 'SELECT id FROM yazilar'; $query = mysql_query($sql); while( $row = mysql_fetch_array($query) ) { $id[] = $row['id']; } $id = array_flip($id); // Dizideki anahtarlar ve degerleri yer değiştir $rastgele_id = array_rand($id, 5); //diziden rastgele 5 adet anahtar seç $rastgele_id = implode(',',$rastgele_id); $sql1 = 'SELECT * FROM yazilar WHERE id IN(' .$rastgele_id. ')'; $query1 = mysql_query($sql1); while( $row1 = mysql_fetch_array($query1) ) { echo $row1['id'].'<br>'; } ?>
Benim bulduğum çözümler bunlar daha iyi bir fikri olan varsa paylaşırsa sevinirim.
İyi kodlamalar :).
Son haberleri çekmek için diyelim ki haberler adlı tablonda haberleri eklenme tarihini tutan tarih adında bir sütun olsun.
Aşağıdaki sorgu ile eklenen son 10 haberi çekebilirsin.
Yöntemleriniz güzel fakat merak ettiğim birşey var. Mesela iki ayrı tablodan aynı kullanıcının gönderdiği verileri çekiyoruz diyelim. Yani örneğin aynı kullanıcıya ait verileri "resimler" ve "yazilar" tablolarından seçerek yazdırıyoruz. Buraya kadar herşey tamam. Fakat bunları yazdırırken mecburen önce resim yada yazıyı, sonra diğerini yazdırıyoruz. Yani sayfanın en üstünde ne olacağını "echo" ile yazdığımızdan resmin mi yazının daha üstte olacağına biz karar vermiş oluyoruz. Peki bunu bize değilde mesela bu verilerin siteye eklenme tarihine göre sıralamak nasıl yapılabilir? Yani sayfanın en üstüne resimler yada yazılar tablolarına en son eklenen içerik görünmeli. Bunu nasıl yapabiliriz?
Aşağıdaki adresten "order by" hakkında detaylı bilgi bulabilirsin. http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html">http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html
Sorgu da union kullanmak çözüm olabilir.
echo $yazi; dediğimde bile kendim bir sıra belirlemiş oluyorum. Dediğim gibi bu sıranın tablo farketmeksizin sadece tarihe göre olması için ne yapılabilir?
merhaba; şöyle bi kod var elimde rastgele çekiyorum yazıları fakat ben bunu 24 saatte bir çekmesini istiyorum. günün konusu olacak.
kod;
kolay gelsin.
Merhaba,
İstediğini en kolay Cron Jobs ile yapabilirsin.
merhaba, bu yöntemle rastgele senenin herhangi bir gününün verilerini çekebilir miyiz?
Süpersin üstad ;)
Pek fazla yorum yapan biri değilimdir ama bu yazı çok işime yaradı teşekkür ederim.
$randomsec=mysql_query("Select * from detayuser");
$kontrolet=mysql_num_rows($randomsec);
if($kontrolet>0){
while($show=mysql_fetch_array($randomsec)){
$id[]=$show["detay_userid"];
}
$sayi=rand(0,($kontrolet-1));
echo $id[$sayi];
}