人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

sqlが出てこなくて悩んでいます。
プレゼント応募者のDBがあるのですが、複数回応募した人については、重複を省いて、20人をランダムに抽出するようなSQLを作りたいのですが、実際に可能でしょうか?

●質問者: Tariq
●カテゴリ:コンピュータ
✍キーワード:dB SQL プレゼント ランダム 抽出
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● buriburimegurin
●35ポイント

http://www.postgresql.jp/document/pg745doc/html/functions-math.h...

PostgreSQLの場合ですが、random()関数によって並び替えのキーを計算して行う方法を考えました。

下記のようなテスト用テーブルを作成して試してみました。

Column | Type | Modifiers

-----------+-----------------------+-----------------------------------------------------------

oubo_id | integer | not null

oubo_name | character varying(30) |

oubo_idはシーケンス(ユニークです)

oubo_nameは応募者の名前です。(今回、これを重複しないようにしました)

データはテスト用に8件だけなのですが...

> select * from test;

oubo_id | oubo_name

---------+-----------

1 | hanako

2 | hanako

3 | hanako

4 | taro

5 | jiro

6 | saburo

7 | siro

8 | goro

(8 rows)

ご質問では任意の20人とありますが、3人でテストしてみます。

(実際にはViewを使って、応募者単位のレコードを取得するか、もしくはテーブルを分割して、

複数回応募してきた人も1レコードのみ作成として、子テーブルに内容をぶら下げるべきだと

思うのですが、とりあえずは平たいテーブルで考えた苦肉の策です。)

select oubo_name

from (

select * from

(select max(oubo_id) oubo_id,oubo_name from test group by oubo_name) sum_test) ran_test

order by random()*oubo_id limit 3;

実行結果です。

=> select oubo_name from ( select * from (select max(oubo_id) as oubo_id,oubo_name fro

m test group by oubo_name) sum_test) ran_test order by random()*oubo_id limit 3;

oubo_name

-----------

hanako

taro

siro

(3 rows)

=> select oubo_name from ( select * from (select max(oubo_id) as oubo_id,oubo_name fro

m test group by oubo_name) sum_test) ran_test order by random()*oubo_id limit 3;

oubo_name

-----------

siro

saburo

hanako

(3 rows)

検索するたびに異なった結果が出てきますがいかがでしょう?

#3を20に変えて読んでください。


2 ● onokun
●15ポイント

http://www.seshop.com/se/edu/shikaku/omo/miti/silver_miti02.asp?...

オラクルマスターへの道:Silver実践講座(SQL編)

検索結果から重複をなくすには、応募者を抽出するSELECT文にDISTINCTをつけるなどすれば良いと思います。

ランダムな抽出は、標準のSQLではできないと思います。

抽選部分はストアドプロシージャを使用するか、抽出結果に対して別途プログラム側で処理することになると思います。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ