- 締切済み
SQLで乱数を使った取得の工夫
お世話になります。 ID,name,point 1.りんご.30 2.みかん.22 3.いちご.18 4.バナナ.13 5.すもも.4 6.マンゴー.1 上記のようなデータがある場合、pointが高いほど 選ばれ易くするようなSQLを記述したいのですが、 その方法をお教えいただけないでしょうか。 ただのランダムであれば、『SELECT * FROM テーブル名 WHERE ID=abs(random()%全レコード数(この場合は6)+1』と すれば、均等にランダムで拾えますが、これを1のりんごのIDほど 取得しやすく、6のマンゴーほど発生しにくくするといった感じです。 以上、よろしくお願いいたします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- mitoneko
- ベストアンサー率58% (469/798)
環境の記載が無いので、いったい、どこまでの構文が使える不明なので考え方だけ。 一つビューを作ります。 ビューのカラムは、元のテーブル全てのカラムに、pointの百分率の累計値を付け加えたものです。(もし、データが三桁の個数があるなら千分率に、四桁の個数があるなら、万分率にしてください) 100まで(千分率なら1000まで、万分率なら10000まで)の乱数を生成し、乱数の数値以下で且つ最大の累計値を持つレコードを選びます。 これで、ポイントの比率に従った確率で、ランダムなレコードが選定できます。 工夫すれば、ビューを生成しなくても一つのSQLで組めるかもしれませんが、利用できるselectの構文に依存します。 累計値が一つのSQLで生成できるかも、同じくです。
- m3_maki
- ベストアンサー率64% (296/460)
読んでる時間無いので検索だけ。 https://www.google.co.jp/?gws_rd=ssl#q=%E9%87%8D%E3%81%BF%E4%BB%98%E3%81%91+%E6%8A%BD%E9%81%B8
補足
回答、ありがとうございます。 説明不足にて申し訳ありません。 環境は、SQLite3を使用しています。 言語はJava.C#を使用しますが、極力 コードには依存せずに、SQLiteだけで 済ませたいと考えています。 再度質問をさせていただきますので、 お答えいただければ幸いです。
- yambejp
- ベストアンサー率51% (3827/7415)
どのSQLを使うかによりますが、条件分岐を使えばよいのでは?
補足
回答、ありがとうございます。 説明不足にて申し訳ありません。 環境は、SQLite3を使用しています。 言語はJava.C#を使用しますが、極力 コードには依存せずに、SQLiteだけで 済ませたいと考えています。 再度質問をさせていただきますので、 お答えいただければ幸いです。
- lupin-333333
- ベストアンサー率31% (294/933)
正確にはSQLでなくプロシージャーなどのような、インタープリターを求めているわけで。 だとしたら、動作環境を書かないと、なんの関数が使えるか、意味不明。
補足
回答、ありがとうございます。 説明不足にて申し訳ありません。 環境は、SQLite3を使用しています。 言語はJava.C#を使用しますが、極力 コードには依存せずに、SQLiteだけで 済ませたいと考えています。 再度質問をさせていただきますので、 お答えいただければ幸いです。
補足
回答、ありがとうございます。 説明不足にて申し訳ありません。 環境は、SQLite3を使用しています。 言語はJava.C#を使用しますが、極力 コードには依存せずに、SQLiteだけで 済ませたいと考えています。 回答いただきましたビューも、できれば 使用せずに内部だけで完結させたいと 思っています。 再度質問をさせていただきますので、 お答えいただければ幸いです。