1

mySQL データベースがあるとしましょう。ID と名前の 2 つの列があり、100 行あります。私がやりたいのは、たとえば 10 個の名前を (繰り返しなしで) 選び出し、それらをランダムな順序で表示することです。

このコードを使用すると、名前を 1 つだけ選択できます...

<?php
include('connection.php');

$rand = rand(1, 100);
$sql = "SELECT * FROM names WHERE ID=$rand";
$result = mysql_query($sql, $sandbox);

while ($row = mysql_fetch_array ($result)) 
{
$name1 = $row['Name'];
echo $name1 . "<br>";
}

?>

... 10 個のランダムな繰り返しのない名前を取得するための最良のコードは何でしょうか?

4

5 に答える 5

1

テーブルの行数によっては、パフォーマンス上の理由からORDER BY RAND()、他の 4 人が提案したようにはしたくないでしょう。

ORDER BY RAND() 操作は、実際にはテーブルの各行を再クエリし、乱数 ID を割り当ててから結果を返します。500 行を超えるテーブルの場合、これには大量の処理時間がかかります。

推奨されるアプローチでは、元のアイデアを拡張して 10 個の ID を取得し、それらに対して単純な選択クエリを実行します。

それらが連続している場合は、その範囲でランダムを生成するか、すべての ID を取得してシャッフルし、最初の 10 個の値を要求できます。

この質問への回答として、他にもいくつかの提案があります。

于 2013-05-18T23:22:05.003 に答える
1

最も簡単な (そしてデータベースにとって最速の) 方法は、範囲関数とシャッフル関数を使用して 10 個の一意の数値を生成し、IN 句を使用してクエリを作成することです。

$numbers = range(1, 100);
shuffle($numbers);
$numbers = implode( ', ', array_slice($numbers, -10) );

$sql = "SELECT * FROM names WHERE ID IN ($numbers)";
// example query: 
// SELECT * FROM names WHERE ID IN (63, 76, 69, 59, 9, 84, 60, 18, 23, 62)
于 2013-05-17T22:23:31.017 に答える
0
$sql = "SELECT DISTINCT id, name FROM names ORDER BY RAND() LIMIT 10"; 
于 2013-05-17T22:05:35.423 に答える
0

使いたくなるORDER BY RAND()

$sql = "SELECT * FROM names ORDER BY RAND() LIMIT 10";
$result = mysql_query($sql, $sandbox);

while ($row = mysql_fetch_array ($result)){
于 2013-05-17T22:05:54.217 に答える
0

これを試して :

 SELECT DISTINCT * FROM names ORDER BY RAND() LIMIT 10
于 2013-05-17T22:20:11.960 に答える