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

kara tarafından 9 Mayıs 2007 tarihinde Programlama, Yazılım kategorisinde yazıldı.

Ü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

SQL:
  1. SELECT sutun FROM tablo
  2.  WHERE rowid>= (abs(random()) % (SELECT max(rowid) FROM tablo))
  3.  LIMIT 5;

MSSQL

SQL:
  1. SELECT TOP 5 sutun FROM tablo
  2.  ORDER BY NEWID()

MySQL

SQL:
  1. SELECT sutun FROM tablo
  2.  ORDER BY RAND()
  3.  LIMIT 1

ORACLE

SQL:
  1. SELECT sutun FROM
  2.   (SELECT sutun FROM tablo
  3.     ORDER BY dbms_random.value )
  4.  WHERE rownum = 1

PostgreSQL

SQL:
  1. SELECT sutun FROM tablo
  2.  ORDER BY RANDOM()
  3.  LIMIT 1

IBM DB2

SQL:
  1. SELECT sutun FROM tablo
  2.  ORDER BY RAND()
  3.  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:
  1. <?php
  2. /*
  3. * Fonksiyon      : rastgeleSatir
  4. *
  5. * Geliştirici   : İzzet Emre Erkan <kara@karalamalar.net>, <eerkan @graf2.com>
  6. * URL            : http://www.karalamalar.net
  7. *       
  8. * Versiyon      : 1.0
  9. * Tarih          : 09.05.2007
  10. * Amaç           : MySQL veritabanı kullanarak belli bir tablodan rastgele bir satır döndürmek
  11. *
  12. * Parametreler
  13. *  $tablo        : Veri çekilecek olan tablo
  14. *  $rowid        : Tablodaki satır tanımlayıcı otomatik artan sütun
  15. *  $secilecekler : (Seçime bağlı) Fonksiyonun döndüreceği satırda seçilecek sütunlar.
  16. *                  (Parametre belirtilmezse tüm sütunlar döner.)
  17. */
  18. function rastgeleSatir($tablo, $rowid, $secilecekler = "*") {
  19.     $maks = mysql_result(mysql_query("SELECT max($rowid) FROM $tablo"),0,0);
  20.     $rastgeleSayi = mt_rand(1,$maks);
  21.     $rastgeleSatir = mysql_fetch_array(mysql_query("SELECT $secilecekler FROM $tablo WHERE $rowid>= $rastgeleSayi ORDER BY $rowid ASC LIMIT 1"));
  22.     if(!is_array($rastgeleSatir))
  23.         $rastgeleSatir = mysql_fetch_array(mysql_query("SELECT $secilecekler FROM $tablo WHERE $rowid <$rastgeleSayi ORDER BY $rowid DESC LIMIT 1"));
  24.     return $rastgeleSatir;
  25. }
  26. ?>

Kullanımı

PHP:
  1. <?php
  2. // Tüm sütunlarla beraber rastgele bir satır döndürmek için
  3. print_r(rastgeleSatir("tablo_adi", "tanimlayici_sutun"));
  4.  
  5. // Belirli sütunlarla beraber rastgele bir satır döndürmek için
  6. print_r(rastgeleSatir("tablo_adi", "tanimlayici_sutun", "sutun1, sutun2, sutun3"));
  7. ?>

Etiketler: , , , , , , , ,