2011-02-11 13 views
2

私は100万レコード以上の "masterurls"というテーブルを持っています。私はクエリが実行されるたびにランダムなレコードを取得したい。前回の実行でフェッチされたレコードは存在しないはずです。SQLクエリの実行ごとにランダムな一意のレコードを選択する方法

SELECT m.url FROM masterurls ORDER BY RAND() LIMIT 200

問題は、上記のクエリは、最初の200百枚のレコードを返し、それを毎回ランダムである:私はすでに、このクエリを持っています。

+1

「m」は定義されていません。どのプログラミング言語? – Starx

答えて

1

を使用することができます。

サンプルコード:最初のページについては (言語によって異なります):

int seed = Math.abs(new Random().nextInt()); 

SQLクエリ:

SELECT url FROM masterurls ORDER BY RAND({seed}) LIMIT 200; 

店のどこかの種(WebベースのアプリケーションのためのURLを使用することができますパラメータまたはセッション)。次のページの場合 :

SELECT url FROM masterurls ORDER BY RAND({seed}) LIMIT 200 * {pageNumber}, 200; 

注:RAND()によってソートする重い操作は、あなたは、モジュールベースまたは他のランダム関数を使用して、URLのハッシュコードを持つ索引列を格納したほうが良いかもしれませんさ。

+0

ありがとう!制限内のランダムなオフセットのアイデアが私の目的を解決しました。 – Ashish

1

以前にURLに既にアクセスしているかどうかをどのように知る予定ですか?私の最善の提案は、テーブルでこれを知るためのフラグを設定することです。 2つの値1または0を受け入れるテーブルのような視野のようなビューを追加します.1つは既にアクセスされ、0はアクセスされていません。そして、あなたがRAND()関数にシードパラメータを渡すことができますので、あなたが最初のページ前のシードを生成することで、ランダムな結果を「ページ付け」することができます

SELECT m.url FROM masterurls m WHERE view='1' ORDER BY RAND() LIMIT 200; 
+0

'view = 1' **に更新している間に、2行目**にどのようにアクセスしますか?私はこの答えに基づいて、一度に1人の視聴者しか働かないことをお勧めします - 列の値が0または2、0 =今閲覧されています。 1 =今すぐ見て2 =見た。 'UPDATE SET view = 1 WHERE view = 1'を実行し、最後に' UPDATE SET view = 2 WHERE view = 1'を実行してください(UPDATE SETビュー= 1 WHEREビュー= 0 ORDER BY RAND(LIMIT 200) 。 –

+0

レコードを取得して更新しないようにクエリを書きました。私は、ウェブページやフォームからレコードを更新することを考えていました。だから、私はSQLからのみこれを行うことは知らないので、どのプログラミング言語を尋ねた。 – Starx

関連する問題