1

SQL データベースクエリから行をランダムに選択するにはどうすればよいですか? これにより、次のことを意味します。

table1 からカテゴリが「緑」のものをすべて選択します。

$stmt = $db->query('SELECT * from table1 WHERE Category LIKE "%green%"');

次に、この選択から行をランダムに表示します (以下で行ったように、この選択からすべての行を表示するのではなく)。

while($rows = $stmt->fetch()){
     echo "<tr><td>". $rows['Number'] . "</td><td>" . $rows['Content'] . "</td></tr>";
};
4

4 に答える 4

5

適度なサイズのデータ​​ セットで、行をランダムに並べ替え、最初の行を選択します。

...ORDER BY RAND() LIMIT 1;

あなたの声明は次のようになります。

$stmt = $db->query(
    'SELECT * from table1
     WHERE Category LIKE "%green%"
     ORDER BY RAND() LIMIT 1;'
);

クエリで選択範囲を絞り込むと、面倒なプロセスを使用して PHP コードの結果セットから 1 行を抽出する必要がなくなります。

データ セットが非常に大きい場合は、Tobias Hagenbeek の推奨に従って複数のクエリを実行することを検討してください。

  1. COUNT()一致する行。
  2. PHP では、1 から の結果までの乱数を選択しますCOUNT()
  3. 新しいクエリを実行して、指定された行を選択します。

    ...LIMIT <random number>, 1;

最後に、単一の任意の行のみが必要で、ランダム性/一意性が問題にならない場合は、Gordon Linoff が提案するように、毎回テーブルから最初の行を選択することを検討してください。

...LIMIT 1;
于 2013-05-16T19:47:48.297 に答える
0

簡単な方法は次のとおりです。

$stmt = $db->query('SELECT * from table1 WHERE Category LIKE "%green%" ORDER BY RAND()');

ORDER BY RAND()結果をランダムに並べ替えますが、操作としては少しコストがかかります (リンク)。

そのようなことを気にする場合は、代わりにテーブル内の行数をクエリしてから$r = rand(0, $count-1)LIMIT 1 OFFSET $rクエリの最後で を実行できます。

于 2013-05-16T19:51:34.603 に答える
0

ORDER BY RAND() を使用することもできますが、そうするのは面倒です。特に、大規模なシステムや 10,000 行を超える場合。

これが理由です...

このようなクエリを実行するとどうなりますか? 10000 行のテーブルでこのクエリを実行すると、SQL サーバーが 10000 個の乱数を生成し、この数値をスキャンして最小のものを探し、この行を取得するとします。乱数の生成は比較的高価な操作であり、最小のものをスキャンする (LIMIT 10 がある場合は、10 個の最小の数字を見つける必要があります) もそれほど高速ではありません (引用符がテキストの場合は遅くなり、サイズが固定されている場合は遅くなります)。おそらく一時テーブルを作成する必要があるためです)。

したがって、行のカウントを行い、0 と count-1 の間の乱数を取得してから、SELECT column FROM table LIMIT $ generated_number, 1 を実行する必要があります。

于 2013-05-16T20:02:32.093 に答える