MySQLでレコードをランダム取得する方法&SQL例

たとえばMySQLを使っていて・・・

  • サンプルとしてレコードを数件抽出したいときとか、
  • あるテーブルからデータをランダム表示したいときとか

こういう風にランダムにレコードを取り出したいことないですか?

意外と難しそうな感じがするけど、
実は RAND関数 というのを使えば、かなり簡単にできます。

ここでは そのレコードのランダム取得のやり方とかSQL例 を紹介します。

ランダム取得は RAND 関数を使えば超簡単!

そのやり方とはRAND関数と ORDER BY を組み合わせること

RAND関数とはリファレンスによると次みたいな関数のこと

RAND(), RAND(N)

0 <= v < 1.0 の範囲内で、ランダムな浮動小数点値 v を返します。定数整数引数 N が指定されている場合は、カラム値の反復可能なシーケンスを生成するシード値として使用されます。次の例では、RAND(3) で生成される値のシーケンスが、発生した両方の場所で同じです。

引用元 : MySQL :: MySQL 5.6 リファレンスマニュアル :: 12.6.2 数学関数

上の説明のように 0 <= v < 1.0  なので 1.0  を含まないのが注意点ですね。

この端数を含まないのは JavaScript の rand関数 とよく似てます。

▼ ちなみに JavaScript の rand関数 について

あと N を渡すことで、乱数の範囲を拡大できるのもJSの rand 関数に似てる気がします。

(例) ==>  N = 3 を渡せば、0 <= v < 3.0 になるということ

 

それでレコードをランダム取得したい場合、
クエリの ORDER BY  に RAND()  を渡せばランダム取得が可能です。

例えば hogehoge  というテーブル名があるとしましょう。

そのテーブルからランダムに1件取得するクエリ例は次の通り

たったこれだけ

汎用的に使うなら、 hogehoge  のとこを各自のテーブル名に置き換えればOKです。

 

あとレコード取得数を増やしたいなら、 LIMIT 1  を任意の数に換えれば好きな数だけ取得できます。

例えば次のクエリが、ランダムに 5件 だけ取得するクエリ例

まさかこういう書き方があったとは・・・

色々応用ができそうなテクニックです。

もし特定レコードを含めてランダム取得するなら...

今紹介した方法は、レコードを無作為に抽出するためのSQL例

もし特例のレコードを含めたいなら、ランダム取得したいなら少し工夫が必要になります。

そのやり方とは・・・ORDERR BY に含めたいレコードを指定すること

 

例えば id  が 3, 5, 7 のレコードを必ず取得するなら、こう書けます。

ポイントは次の2つ

  • 含めたい値を (id = 3) DESC  みたいに指定する
  • 含めたい値の条件は RAND  関数の前に必ず書く

もしランダム取得以上のことをやりたいなら、こういう工夫も必要です。

レコードランダム取得のまとめ

ということで、簡単にまとめ

  • ランダム取得は RAND 関数を使う
    この関数は 0 <= x < 1 を返す関数で、 ORDER BY RAND()  のようにすればランダムにレコード取得できる。取得する件数は LIMIT 1  などで指定する
  • 特定レコードだけ含めるなら、、、
    もし特定レコードを必ず含めたいなら ORDER BY (id = 3) DESC  のように、レコードを一意に取得できるクエリを含めればOK

地味だけど、いろいろな場面で役立ちそうなテクニックかもしれません。

以上、MySQLでレコードをランダム取得する方法でした。ではでは

Commentsこの記事についたコメント

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください