2009-08-16 14 views
10

私はクイズのウェブサイトを開発しており、すべての質問を格納しているデータベースがあります。 数学、科学、歴史などのさまざまな種類のクイズがあります。すべての質問は1つのテーブルに保存されています。MySQLでランダムな行を選択

questions (qno(int) ,type(int), question, .... ,...) 

qnoが主キーである、とtype

if type = 1 (math) 
type = 2(science) 

は今、私が選択したい:クイズの種類を追跡するために使用されます。

私の質問表には、次のようになりますテストの種類ごとにランダムな質問がいくつかあります。 たとえば、数学的なテストにのみランダムな20の質問を選択したいことがあります。

MySQLにはランダムな行を選択する方法がありますか?

+0

dup [SQLでランダムな行を要求する方法](http://stackoverflow.com/q/19412/)、[mysqlの大きなテーブルからランダムな行を簡単に選択](http:// stackoverflow.com/q/211329/90527)。 – outis

+0

[MySQLは600K行から10個のランダムな行を高速で選択](https://stackoverflow.com/a/4329447/6521116) –

答えて

19

MySQLでrand関数を使用して行を並べ替え、次にlimitで上位10個(または好きなだけ)を使用できます。

select * from table order by rand() limit 10 

あなただけの数学の質問をしたい場合:

select * from table where type = 1 order by rand() limit 10 
+0

私は一度に1つの質問を表示したい。だから私は、クイズが始まると上記のクエリを使用することを考えているし、私はセッションですべての質問noを格納し、次に毎回新しいquesryを使用して各質問をfectchします。それは正しいアプローチですか? – user156073

+0

1ページにつき1つの質問だけが必要な場合は、「制限10」ではなく「制限1」を実行してください。 – Eric

+0

そのユーザーが見た質問をテーブルに格納してから、このテーブルに参加したままのクエリを作成し、表示されているテーブルのフィールドがnullの場合。 – Unsliced

3

は、UNIXタイムスタンプを保持するあなたのテーブルに列を追加します。

1日に1回、またはあなたに適した任意の時間枠を使用して、その列を更新するクエリを実行します。

この場合、クエリは真夜中に実行され、次のようになります。

UPDATE table SET rand_id = (UNIX_TIMESTAMP() + (RAND() * 86400)); 

次に、このようなクエリを使用します。所定のランダムな値を持つ列を使用して

SELECT * FROM table WHERE rand_id > UNIX_TIMESTAMP() ORDER BY rand_id ASC LIMIT 20 

は、ページのすべての単一の要求のためのテーブルにすべての単一の行のためのランダム化機能を実行する必要が保存されます。

0

もう1つの可能性は、random permutationを生成し、これをセッション(または必要な部分のみ、アルゴリズムは簡単に適応可能)に保存し、必要なときに質問を取得することです。

関連する問題