2011-06-30 17 views
5

Bu konuyla ilgili birçok konu gördüm ve nasıl yapılacağını anlamada başarısız oldum. ÖrneğinMySQL ile rastgele satır seçimi

, bu tabloyu varsa:

+------+-------+-------+ 
| id | name | class | 
+------+-------+-------+ 
| 5 | test | one | 
| 10 | test2 | one | 
| 12 | test5 | one | 
| 7 | test6 | two | 
+------+-------+-------+ 

ve ben bunu nasıl, sınıf "bir" den sadece X satırları rastgele göstermek ister misin?

not: büyük tablosu, bu yüzden ORDER BY RAND'ı kullanmak istemiyorum. rand() tarafından

+0

olası yinelenen (http://stackoverflow.com/questions/211329/quick-selection-of-a-random-row-from-a-large-table-in-mysql) – outis

cevap

20

Çoğu insanın önerdiği ORDER BY RAND() çözümü, zaten bildiğiniz gibi büyük tablolara ölçeklendirilmez.

SET @r := (SELECT FLOOR(RAND() * (SELECT COUNT(*) FROM mytable))); 
SET @sql := CONCAT('SELECT * FROM mytable LIMIT 1 OFFSET ', @r); 
PREPARE stmt1 FROM @sql; 
EXECUTE stmt1; 

kitabımda, SQL Antipatterns: Avoiding the Pitfalls of Database Programming bu ve diğer çözümler kapsamaktadır.


PHP ile bunu istiyorsanız, böyle bir şey (test) yapabilirdi:

<?php 
$mysqli->begin_transaction(); 
$result = $mysqli->query("SELECT COUNT(*) FROM mytable") 
$row = $result->fetch_row(); 
$count = $row[0]; 
$offset = mt_rand(0, $count); 
$result = $mysqli->query("SELECT * FROM mytable LIMIT 1 OFFSET $offset"); 
... 
$mysqli->commit(); 
[MySQL büyük bir tablodan rastgele sıranın hızlı bir şekilde seçilmesi] arasında
+0

Vay, bu yüksek SQL seviyesidir. PHP'de bu mümkün mü? ve onun mysqli_query() üzerine yazmam gereken tam kodu? – Daniel

+0

Basit miyim? – Daniel

+0

Yukarıdaki örneği PHP'ye güncelledim. Ama test edilmedi. –

0
SELECT * FROM `table` WHERE `class`="one" ORDER BY RAND() LIMIT 5 
+0

Dikkat: Büyük bir masa kullanıyorum ve ORDER BY RAND () tablodaki tüm satırları ve çok yavaş bombalayın. – Daniel

2
select ID, NAME, CLASS 
from YOURTABLE 
where CLASS='one' 
order by rand() 
limit $x 

sipariş özellikle verimli değildir, ama bunu yapmanın en küçük/en hızlı şekilde ilgili.

+0

Uyarı: Büyük tabloyu kullanıyorum ve ORDER BY RAND() tablodaki tüm satırları ve çok yavaş bir şekilde bombalarım. – Daniel

+0

Evet, ancak yalnızca sınıfın "bir" olduğu satırları sıralamak, tüm tabloyu değil. –

+0

"bir" sınıfı binlerce satır içerebilir. Bu arada, messenger & skype'ı alabilir miyim? – Daniel