[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 メーリングリストの案内