[pgsql-jp: 38954] Re: SQLでのランダム取得

MINOURA Michio minoura @ wplanning.co.jp
2007年 11月 16日 (金) 16:05:34 JST


こんにちは。みのうらと申します。

random() 関数を使用する前に setseed()でランダム値の種をセットして
やれば良いのではないでしょうか?
例えばユーザー毎にそのユーザーがアクセスしてきた時間(x)などをPHPで
保持しておいて、クエリを発する前に必ず
setseed(x)を呼び出してやれば、

 ORDER BY random() LIMIT 31 OFFSET 30*ページ数;

で、望みどおりの結果が得られるかと思います。
もちろんユーザー毎にxは異なるので、その意味ではランダムな順番で、
且つ同一ユーザーには一定の順番(常に重複なし)というわけです。

(ヘビーユーザーではないので間違ってたらすみません。)

吉野 康治 wrote:
> お世話になります。吉野です。
> 
> あるテーブルをランダムで取得して、且つ30件ずつ別ファイルで
> Web表示をしようとしております。
> 
> 現状の処理は、
> そのテーブルのカラムに乱数格納用として"random_num"を用意し、
> PHPで
> 
> $SQL = "SELECT id FROM table_name";
> @$res=pg_query($SQL);
> @$numrows=pg_numrows($res);
> for($i=0;$i<$numrows;$i++){
>    $random = rand(0,10000);
>    @$row=pg_fetch_array($res,$i,PGSQL_ASSOC);
>    $SQL="UPDATE table_name SET random_num'$random' WHERE id='$row[id]'";
>    pg_query($SQL);
> }
> 
> という乱数設定の処理を1時間毎にCronで処理させて
> 表示側で
> 
> ORDER BY table_name.random_num asc LIMIT 31 OFFSET 30*ページ数;
> 
> で表示させているのですが、
> 上記の乱数設定を1時間毎にしているとサーバに負荷が掛かり過ぎてしまいます。
> 出来ればPHPでの乱数設定の処理はやめたいのですが、
> 表示側のSQLを
> ORDER BY random() LIMIT 31 OFFSET 30*ページ数;
> にしてしまうとページ数毎にセッションを別にしているので、
> 取得されたものが重複してしまい、うまくいきません。
> 
> どうにかしてSQL1発で解決する方法はありませんでしょうか?
> 
> ご意見お願い致します。
> 
> 



pgsql-jp メーリングリストの案内