Mysql Veritabanından Rastgele Veri Çekme Yöntemleri

Kategori : PHP, Mysql Yazar : alexander Tarih : 26 Eyl 2010, Pa 15:43 16 Yorum

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.

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 :).

Yorumlar >> (16 Yorum)

  1. kardeş yardımm.. 20 Şub 2011, Pa 18:48 tarihinde yazılmış.
    kardeş sağolasın çok güzel çalışma şunu sormak istiyorum mesela sen veritabanından nesneleri çekerken alt alta listeletmişsin.Peki bazı grafiksel özelliklerini ayarlayamaz mıyız.Renk veya div içerisinde olması gibi..Bir de mesela son eklenen haberleri nasıl gösteririz..
    • alexander 20 Şub 2011, Pa 18:58 tarihinde yazılmış.
      Ben sql kısmını anlatmak için o örneği yapmıştım. Tabiki css ile daha görsel bir şekilde sıralaman mümkün.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.
      SELECT * FROM haberler ORDER BY tarih DESC LIMIT 0,10
  2. Çiftçi 20 Şub 2011, Pa 18:59 tarihinde yazılmış.
    Merhaba,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?
    • alexander 20 Şub 2011, Pa 19:17 tarihinde yazılmış.
      sorunuzu tam anlayamadım açıkçası ama tarih sıralamasına göre son eklenen verileri çekmek istiyorsan "order by" kullanmalısın. Bir önceki yorumda verdiğim sorguda order by kullanımı var zaten ordan bakabilirsin.Aşağıdaki adresten "order by" hakkında detaylı bilgi bulabilirsin. http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html
    • Çiftçi 20 Şub 2011, Pa 19:21 tarihinde yazılmış.
      Hayır ordey by'ı biliyorum fakat tam olarak onu sormuyorum. Mesela tam olarak dediğim şey olmasada facebooktaki gibi düşünebilirsiniz. Yani bir kişi videoda paylaşsa, yada herhangi bir not, yada durum güncellemesi yapsada, tüm bunlar farklı kategorilerde olmalarına rağmen, aynı sayfa üzerinde eklenme tarihlerine göre diziliyorlar. Yani nasıl desem bu "sıralama esnekliği" nasıl yapılabilir?
    • alexander 20 Şub 2011, Pa 19:24 tarihinde yazılmış.

      Sorgu da union kullanmak çözüm olabilir.

      (Select sutun_a,sutun_b,tarih
      from tablo_1 order by tarih desc)
      UNION
      (Select sutun_c,sutun_d,tarih
      from tablo_2 order by tarih desc)
      Order by tarih desc
    • Çiftçi 20 Şub 2011, Pa 19:46 tarihinde yazılmış.
      Peki bunu yazdırma olayı nasıl olacak? Zira echo $resim; 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?
    • alexander 20 Şub 2011, Pa 19:46 tarihinde yazılmış.
      veriler sırayla gelecek zaten . sorguyu çalıştırıp php ile deneyrek yazdırmaya çalışın. bende denemedim açıkçası deneyecek zamanım da yok. Takıldığınız noktalarda forum sitelerine sorarsanız mutalaka bir cevap alacaksınız.
  3. emre 24 Şub 2011, Pe 14:15 tarihinde yazılmış.
    bende veri tabanında oluşturduğum bir tabloyu ekrana tamamiyla yaziyorum. ancak bunlardan mesela 2. satiri sadece nasil yazdirabilirim. ?
  4. tahir 25 Mar 2011, Cu 23:10 tarihinde yazılmış.

    merhaba; şöyle bi kod var elimde rastgele çekiyorum yazıları fakat ben bunu 24 saatte bir çekmesini istiyorum. günün konusu olacak.
    kod;

    <?
    include(“baglan.php”); // VT bağlan
    $sorgu=mysql_query(“SELECT * FROM tablo ORDER BY RAND() LIMIT 0,1”);
    
    while ($isthost=mysql_fetch_array($sorgu) ){
    }
    ?> 
    

    kolay gelsin.

  5. yusuf 14 Nis 2011, Pe 16:07 tarihinde yazılmış.

    merhaba, bu yöntemle rastgele senenin herhangi bir gününün verilerini çekebilir miyiz?

    Yorum Yap

    Yeni yorum yapıldığında bana bildir.

    Yorum Yazarken

    Basit Html etiketlerini kullanabilirsiniz.

    Kodlarınızı <pre></pre> etiketleri arasına yazınız.