Rasgele MySQL ile Satırları seçme

5 Cevap php

Rastgele bir tablodan kayıtları seçmek için; Ben her zaman PHP geçici bir değişken ayarlamak gerekiyor? Ben CodeIgniter modeli içinde rastgele satır seçmek ile biraz yardıma ihtiyacım var, ve sonra Anasayfam bakıldı her seferinde bir görünümde üç farklı olanları görüntüler. Herkes bu sorunu çözmek konusunda herhangi bir düşünce var mı? Şimdiden teşekkürler!

5 Cevap

Ben rastgele bir teklif almak için üretimde bu kod parçası var. MySQL RAND fonksiyonunu kullanarak yavaş süper oldu. Hatta veritabanında 100 tırnak, ben sitesinde bir gecikme süresi fark edildi. Bu grubu, hiç lag yoktu.

$result = mysql_query('SELECT COUNT(*) FROM quotes');
$count = mysql_fetch_row($result);
$id = rand(1, $count[0]);
$result = mysql_query("SELECT author, quote FROM quotes WHERE id=$id");

Eğer satır bir ton yoksa, sadece yapabilirsiniz:

SELECT * FROM myTable ORDER BY RAND() LIMIT 3;

Eğer birçok satır varsa, bu yavaş olsun, ama daha küçük veriler için para cezası çalışacak ayarlar olacaktır.

Steve Michel onun cevabını bahseder gibi, bu yöntem büyük tablolar için çok çirkin alabilirsiniz. Onun öneri kapalı atlamak için iyi bir yerdir. Eğer masanın üzerinde yaklaşık maksimum tamsayı PK biliyorsanız, tek ve maksimum PK değeri arasında rastgele bir sayı üretmek gibi bir şey yapabilirim, sonra gibi bir zamanda rastgele satır bir kapmak:

$q="SELECT * FROM table WHERE id >= {$myRandomValue}";
$row = $db->fetchOne($q); //or whatever CI's interface to grab a single is like

Tabii ki 3 rastgele satır gerekiyorsa, burada üç sorgu gerekir, ama onlar PK tamamen konum olarak, onlar (bütün tablo randomizing daha er) hızlı olacak.

Ben böyle bir şey yapardı:

SELECT * FROM table ORDER BY RAND() LIMIT 1;

Bu rastgele bir sırayla veri koymak ve o rasgele yalnızca ilk satırı dönecektir.

Eğer böyle bir sorgu gerekir:

SELECT * 
FROM tablename
WHERE somefield='something'
ORDER BY RAND() LIMIT 3

It is taken from the second result of http://www.google.com/search?q=mysql+random and it should work ;)

Tablo çok büyükse rand tarafından büyük bir tablo sipariş () çok pahalı olabilir. MySQL geçici bir tablo oluşturmak ve bunu çözmek gerekir. Eğer birincil anahtarı var ve tabloda kaç satır biliyorum, x almak istediğiniz satırın sayısı rastgele satır kapmak için sınırı X, 1 kullanın.