Veritabanındaki bir tablodan nasıl rastgele satır(lar) seçerim?

Ürünlerin arasından bir kaç tanesini rastgele göstermek istiyorsunuz ya da makalelerinizin hep aynı sırada çıkmasını istemiyorsunuz. Aşağıda bir kaç değişik veritabanında nasıl rastgele satır(lar) çağırabileceğinizi gösteren kod örnekleri var. Aşağıdaki yöntemleri kullanırken çok fazla kayıt olan tablolardan veri çekerken performans problemleriyle karşılaşabilirsiniz. Rastgele alan anlık olarak yaratıldığından ORDER ya da WHERE şartlarını kullandığınızda indeks olmayan bir alanda sorgu yaptığınız için tablodaki satır miktarı ne kadar fazlaysa performans o kadar düşecektir. Aklınızın bir köşesinde bulunsun.

SQLite

SELECT sutun FROM tablo
 WHERE rowid >= (abs(random()) % (SELECT max(rowid) FROM tablo))
 LIMIT 5;

MSSQL

SELECT TOP 5 sutun FROM tablo
 ORDER BY NEWID()

MySQL

SELECT sutun FROM tablo
 ORDER BY RAND()
 LIMIT 1

ORACLE

SELECT sutun FROM
  (SELECT sutun FROM tablo
    ORDER BY dbms_random.value )
 WHERE rownum = 1

PostgreSQL

SELECT sutun FROM tablo
 ORDER BY RANDOM()
 LIMIT 1

IBM DB2

SELECT sutun FROM tablo
 ORDER BY RAND()
 FETCH FIRST 1 ROWS ONLY

Şurada PHP ve MySQL için rastgele satır seçimi konusunda alternatif bir çözüm var. Ben de örnekteki kodu temel alarak şöyle bir kod ürettim.

< ?php
/*
* Fonksiyon      : rastgeleSatir
*
* Geliştirici   : İzzet Emre Erkan , 
* URL            : http://www.karalamalar.net
*       
* Versiyon      : 1.0
* Tarih          : 09.05.2007
* Amaç           : MySQL veritabanı kullanarak belli bir tablodan rastgele bir satır döndürmek
*
* Parametreler
*  $tablo        : Veri çekilecek olan tablo
*  $rowid        : Tablodaki satır tanımlayıcı otomatik artan sütun
*  $secilecekler : (Seçime bağlı) Fonksiyonun döndüreceği satırda seçilecek sütunlar.
*                  (Parametre belirtilmezse tüm sütunlar döner.)
*/
function rastgeleSatir($tablo, $rowid, $secilecekler = "*") {
	$maks = mysql_result(mysql_query("SELECT max($rowid) FROM $tablo"),0,0);
	$rastgeleSayi = mt_rand(1,$maks);
	$rastgeleSatir = mysql_fetch_array(mysql_query("SELECT $secilecekler FROM $tablo WHERE $rowid >= $rastgeleSayi ORDER BY $rowid ASC LIMIT 1"));
	if(!is_array($rastgeleSatir))
		$rastgeleSatir = mysql_fetch_array(mysql_query("SELECT $secilecekler FROM $tablo WHERE $rowid < $rastgeleSayi ORDER BY $rowid DESC LIMIT 1"));
	return $rastgeleSatir;
}
?>

Kullanımı

< ?php
// Tüm sütunlarla beraber rastgele bir satır döndürmek için
print_r(rastgeleSatir("tablo_adi", "tanimlayici_sutun"));

// Belirli sütunlarla beraber rastgele bir satır döndürmek için
print_r(rastgeleSatir("tablo_adi", "tanimlayici_sutun", "sutun1, sutun2, sutun3"));
?>

yükleniyor...

“Veritabanındaki bir tablodan nasıl rastgele satır(lar) seçerim?” üzerine 4 yorum

  1. ben dreamweaver kullanarak bir seyler yapmishtim ,sizin yazdiginiz rastgele olayida cok isime yaradi tesekkurler,mumkunse bu sekilde kis bir anlatimla sitede en cok okunan makaleleri mesela ilk 3 makaleyi nasil gosterebilirim,

  2. 1.
    SELECT sutun FROM tablo
    2.
    ORDER BY RAND()
    3.
    FETCH FIRST 1 ROWS ONLY

    Merhaba ,
    Ne yazik ki bu verdiginiz ornek tam dogru degil . DB2 once tablo’dan sutunlari sequential scan yaparak sececek . yine sirali . sadece sirali secilmis gruptaki satirlardan rastgele seciyorsunuz . bu kesinlikle rastgele bir satir donecek demek degildir .

    Eger ayni sorguyu soyle yazarsak ,

    SELECT sutun , rand() as rastgele FROM tablo
    order by rastgele
    FETCH FIRST 1 ROW ONLY

    donecek satirin rastgele oldugundan emin olmus oluruz .

Yorumlar kapalı.