2011-06-30 18 views
5

私はこの主題について多くの話題を見ましたが、私はそれを行う方法の理解に失敗しました。どのように私はそれを行うことができますMySQLでランダムな行を選択

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

と私はクラスからランダムにのみX行を表示したい「1」、例えば:

、私はこのテーブルを持っている場合は?

注:大きなテーブルなので、ORDER BY RANDを使用したくありません。

+0

可能重複(http://stackoverflow.com/questions/211329/quick-selection-of-a-random-row-from-a-large-table-in-mysql) – outis

答えて

20

ほとんどの人が推薦している解決策は、あなたがすでに知っているように、大きなテーブルに拡張されません。

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; 

私の書籍「SQL Antipatterns: Avoiding the Pitfalls of Database Programming」には、これと他の解決方法が記載されています。


あなたはPHPでこれを行うにしたい場合は、このような何か(テストされていない)を行うことができます:

<?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での大きなテーブルからランダムに行を素早く選択]の
+0

うわー、これは高水準のSQLです。これはPHPでも可能ですか?とmysqli_query()で書く必要がある完全なコード? – Daniel

+0

私は簡単なことができますか? – Daniel

+0

上記の例をPHPに更新しました。しかし、それはテストされていません。 –

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

注意:私は大きなテーブルを使用して、ORDER BY RAND( )bomテーブルのすべての行と非常にゆっくりと。 – Daniel

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

rand()によって順序は特に効率的ではありませんが、それはそれを行うための最小/最速の方法についてです。

+0

注意:私は大きなテーブルを使用し、テーブル内のすべての行をORDER BY RAND()で非常にゆっくりと使用します。 – Daniel

+0

はい、ただし、テーブル全体ではなく、クラスが「1」の行だけをソートすることになります。 –

+0

クラス「1」には何千もの行を含めることができます。 ところで、私はあなたのメッセンジャー&スカイプを入手できますか? – Daniel

関連する問題