たとえばMySQLを使っていて・・・
- サンプルとしてレコードを数件抽出したいときとか、
- あるテーブルからデータをランダム表示したいときとか
こういう風にランダムにレコードを取り出したいことないですか?
意外と難しそうな感じがするけど、
実は RAND関数 というのを使えば、かなり簡単にできます。
ここでは そのレコードのランダム取得のやり方とかSQL例 を紹介します。
ランダム取得は RAND 関数を使えば超簡単!
そのやり方とはRAND関数と ORDER BY を組み合わせること
RAND関数とはリファレンスによると次みたいな関数のこと
RAND(), RAND(N)
0 <= v < 1.0 の範囲内で、ランダムな浮動小数点値 v を返します。定数整数引数 N が指定されている場合は、カラム値の反復可能なシーケンスを生成するシード値として使用されます。次の例では、RAND(3) で生成される値のシーケンスが、発生した両方の場所で同じです。
上の説明のように 0 <= v < 1.0 なので 1.0 を含まないのが注意点ですね。
この端数を含まないのは JavaScript の rand関数 とよく似てます。
▼ ちなみに JavaScript の rand関数 について
あと N を渡すことで、乱数の範囲を拡大できるのもJSの rand 関数に似てる気がします。
(例) ==> N = 3 を渡せば、0 <= v < 3.0 になるということ
それでレコードをランダム取得したい場合、
クエリの
ORDER BY に
RAND() を渡せばランダム取得が可能です。
例えば hogehoge というテーブル名があるとしましょう。
そのテーブルからランダムに1件取得するクエリ例は次の通り
1 |
SELECT * FROM hogehoge ORDER BY RAND() LIMIT 1 |
たったこれだけ
汎用的に使うなら、 hogehoge のとこを各自のテーブル名に置き換えればOKです。
あとレコード取得数を増やしたいなら、 LIMIT 1 を任意の数に換えれば好きな数だけ取得できます。
例えば次のクエリが、ランダムに 5件 だけ取得するクエリ例
1 |
SELECT * FROM hogehoge ORDER BY RAND() LIMIT 5 |
まさかこういう書き方があったとは・・・
色々応用ができそうなテクニックです。
もし特定レコードを含めてランダム取得するなら...
今紹介した方法は、レコードを無作為に抽出するためのSQL例
もし特例のレコードを含めたいなら、ランダム取得したいなら少し工夫が必要になります。
そのやり方とは・・・ORDERR BY に含めたいレコードを指定すること
例えば id が 3, 5, 7 のレコードを必ず取得するなら、こう書けます。
1 2 3 4 5 6 7 8 9 10 11 |
/** 特定のレコードは必ず含める */ SELECT * FROM hogehoge ORDER BY (id = 3) DESC, (id = 5) DESC, (id = 7) DESC, RAND() LIMIT 5 /** あるいはこういう書き方も... */ SELECT * FROM hogehoge ORDER BY (id in (3, 5, 7)) DESC, RAND() LIMIT 5 |
ポイントは次の2つ
- 含めたい値を (id = 3) DESC みたいに指定する
- 含めたい値の条件は RAND 関数の前に必ず書く
もしランダム取得以上のことをやりたいなら、こういう工夫も必要です。
レコードランダム取得のまとめ
ということで、簡単にまとめ
- ランダム取得は RAND 関数を使う
この関数は 0 <= x < 1 を返す関数で、 ORDER BY RAND() のようにすればランダムにレコード取得できる。取得する件数は LIMIT 1 などで指定する
- 特定レコードだけ含めるなら、、、
もし特定レコードを必ず含めたいなら ORDER BY (id = 3) DESC のように、レコードを一意に取得できるクエリを含めればOK
地味だけど、いろいろな場面で役立ちそうなテクニックかもしれません。
以上、MySQLでレコードをランダム取得する方法でした。ではでは